Start · Sprachen · PHP · Referenz · msg_get_queue

msg_get_queue

Funktion

Legt eine POSIX-Nachrichten-Warteschlange an oder hängt sich an eine existierende an und gibt ein <code>SysvMessageQueue</code>-Handle zurück.

seit PHP 4.3.0 Kategorie: misc

Signatur

msg_get_queue(int $key, int $permissions = 0666): SysvMessageQueue|false

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

Typ
SysvMessageQueue|false
Beschreibung
Gibt ein 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";
}
Nachricht erfolgreich gesendet.

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);
Empfangen (Typ 42): IPC funktioniert!

// 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.