Signatur
Beschreibung
msg_get_queue() ist der Einstiegspunkt in Philipps System-V-Nachrichten-Warteschlangen-API. Die Funktion erzeugt eine neue Warteschlange, falls unter dem angegebenen Schlüssel noch keine existiert, oder verbindet sich mit der bereits vorhandenen Warteschlange. Das zurückgegebene Handle wird anschließend an msg_send() und msg_receive() übergeben.
Nachrichten-Warteschlangen eignen sich besonders für die Inter-Prozess-Kommunikation (IPC) auf einem einzelnen Rechner: Verschiedene PHP-Prozesse (z. B. Worker und Dispatcher) können damit zuverlässig Nachrichten unterschiedlichen Typs austauschen, ohne auf Dateien oder Datenbanken angewiesen zu sein.
Der Parameter key identifiziert die Warteschlange systemweit. Ein typischer Weg, einen stabilen Schlüssel zu erzeugen, ist ftok(). Der optionale Parameter permissions legt die Unix-Dateiberechtigungen (oktale Angabe) fest, die beim Anlegen der Warteschlange gesetzt werden – bei einer bereits existierenden Warteschlange wird er ignoriert.
Die Funktion ist nur auf Unix-ähnlichen Systemen verfügbar, auf denen die System-V-IPC-Erweiterung (sysvmsg) kompiliert wurde. Unter Windows steht sie nicht zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key Pflicht | int | Systemweiter numerischer Schlüssel, der die Warteschlange identifiziert. Üblicherweise mit ftok() aus einem Dateipfad erzeugt. |
|
| $permissions | int | 0666 | Oktale Unix-Berechtigungen für die neu anzulegende Warteschlange (z. B. 0600 für nur-eigentümer). Wird ignoriert, wenn die Warteschlange bereits existiert. |
Rückgabewert
SysvMessageQueue-Objekt (vor PHP 8.0 eine Ressource) zurück, das das Handle zur Warteschlange darstellt. Bei einem Fehler (z. B. fehlende Berechtigungen) wird false zurückgegeben.Beispiele
Warteschlange anlegen und Nachricht senden
<?php
// Stabilen Schlüssel aus einer Datei erzeugen
$key = ftok(__FILE__, 'A');
// Warteschlange anlegen oder an existierende anhängen
$queue = msg_get_queue($key, 0666);
if ($queue === false) {
die('Warteschlange konnte nicht erzeugt werden.');
}
// Nachricht vom Typ 1 senden
$success = msg_send($queue, 1, 'Hallo aus Prozess ' . getmypid());
if ($success) {
echo "Nachricht erfolgreich gesendet.\n";
} else {
echo "Fehler beim Senden.\n";
}
Producer-Consumer-Beispiel mit zwei Prozessen
<?php
$key = ftok(__FILE__, 'B');
$queue = msg_get_queue($key, 0600);
$pid = pcntl_fork();
if ($pid === 0) {
// --- Kind-Prozess: Empfänger ---
msg_receive($queue, 0, $msgtype, 1024, $message, true, MSG_IPC_NOWAIT);
echo "Empfangen (Typ {$msgtype}): {$message}\n";
exit(0);
}
// --- Eltern-Prozess: Sender ---
msg_send($queue, 42, 'IPC funktioniert!');
pcntl_wait($status); // auf Kind warten
// Warteschlange aufräumen
msg_remove_queue($queue);
// Wichtig · Fallstricke
Plattform: msg_get_queue() ist ausschließlich auf Unix-ähnlichen Systemen verfügbar, auf denen PHP mit der sysvmsg-Erweiterung gebaut wurde. Auf Windows-Systemen ist die Funktion nicht vorhanden.
Ressource vs. Objekt: Ab PHP 8.0 gibt die Funktion ein SysvMessageQueue-Objekt statt einer einfachen Ressource zurück. Code, der is_resource() zur Prüfung verwendet, muss entsprechend angepasst werden.
Aufräumen: Nicht mehr benötigte Warteschlangen sollten mit msg_remove_queue() explizit gelöscht werden, da sie im System-IPC-Speicher verbleiben, bis sie manuell entfernt oder das System neu gestartet wird (ipcs / ipcrm auf der Shell).
Berechtigungen: Prozesse, die auf eine fremde Warteschlange zugreifen wollen, benötigen passende Unix-Berechtigungen. Wähle 0600 für exklusiven Eigentümer-Zugriff oder 0660 für Gruppenfreigabe.