Signatur
Beschreibung
SysvMessageQueue ist eine opake Klasse, die seit PHP 8.0 den bisherigen resource-Typ für System-V-Nachrichtenwarteschlangen ersetzt. Instanzen dieser Klasse werden ausschließlich von der Funktion msg_get_queue() erzeugt und können nicht manuell instanziiert werden.
System-V-Nachrichtenwarteschlangen (Message Queues) sind ein klassischer IPC-Mechanismus (Inter-Process Communication) unter Unix/Linux. Sie ermöglichen es, typisierte Nachrichten zwischen verschiedenen Prozessen auszutauschen, ohne dass ein gemeinsamer Speicherbereich oder eine Netzwerkverbindung benötigt wird. Die Warteschlange besteht im Kernel-Speicher und ist über einen systemweit eindeutigen Schlüssel (Key) identifizierbar.
Typische Anwendungsfälle sind die Kommunikation zwischen einem übergeordneten PHP-Prozess und seinen Kind-Prozessen (z. B. nach pcntl_fork()), Job-Queues auf System-Ebene sowie die koordinierte Verarbeitung von Aufgaben durch mehrere Worker-Prozesse auf demselben Rechner.
Die wichtigsten Begleitfunktionen sind msg_send() zum Einreihen von Nachrichten, msg_receive() zum Empfangen, msg_stat_queue() zum Abfragen von Metadaten und msg_remove_queue() zum Löschen der Warteschlange. Die Klasse selbst stellt keine öffentlichen Methoden bereit.
Beispiele
Einfaches Senden und Empfangen einer Nachricht
<?php
// Gemeinsamen Schlüssel erzeugen (z. B. aus einer Datei und einem Projekt-ID)
$key = ftok(__FILE__, 'A');
// Warteschlange öffnen oder erstellen
$queue = msg_get_queue($key, 0666);
if (!($queue instanceof SysvMessageQueue)) {
die('Warteschlange konnte nicht erstellt werden.');
}
// Nachricht vom Typ 1 senden
$data = ['job' => 'resize_image', 'file' => 'photo.jpg'];
$sent = msg_send($queue, 1, $data, true, true, $errorCode);
if ($sent) {
echo "Nachricht erfolgreich gesendet.\n";
} else {
echo "Fehler beim Senden. Fehlercode: $errorCode\n";
}
// Nachricht empfangen (blockierend)
$msgType = 0;
$received = null;
msg_receive($queue, 1, $msgType, 8192, $received, true, 0, $errorCode);
echo "Empfangener Job: " . $received['job'] . "\n";
echo "Datei: " . $received['file'] . "\n";
// Warteschlange aufräumen
msg_remove_queue($queue);
Produzent-Konsument-Muster mit pcntl_fork()
<?php
$key = ftok(__FILE__, 'B');
$queue = msg_get_queue($key, 0666);
$pid = pcntl_fork();
if ($pid === -1) {
die('fork() fehlgeschlagen');
} elseif ($pid === 0) {
// Kind-Prozess: Konsument
$msgType = 0;
$message = null;
msg_receive($queue, 0, $msgType, 1024, $message, true, 0, $err);
echo "Kind empfängt: $message\n";
exit(0);
} else {
// Eltern-Prozess: Produzent
sleep(1); // kurz warten, damit Kind bereit ist
msg_send($queue, 1, 'Hallo vom Eltern-Prozess', false, true, $err);
pcntl_waitpid($pid, $status);
msg_remove_queue($queue);
echo "Eltern-Prozess fertig.\n";
}
// Wichtig · Fallstricke
Plattformabhängigkeit: System-V-IPC ist nur auf Unix/Linux verfügbar. Unter Windows wird diese Klasse nicht unterstützt. PHP muss mit --enable-sysvmsg kompiliert worden sein.
Ressourcen-Verwaltung: Warteschlangen bleiben im Kernel erhalten, bis sie explizit mit msg_remove_queue() gelöscht oder das System neu gestartet wird. Vergessene Warteschlangen können mit ipcs -q angezeigt und mit ipcrm manuell entfernt werden.
Serialisierung: Beim Senden von Arrays oder Objekten ($serialize = true) verwendet PHP intern serialize(). Das empfangende Ende muss ebenfalls mit $unserialize = true lesen. Bei deserialisierten Daten aus unsicheren Quellen besteht das Risiko von Object-Injection-Angriffen — die Warteschlange sollte daher ausschließlich von vertrauenswürdigen Prozessen beschrieben werden.
Kapazitätsgrenzen: Die maximale Nachrichtengröße und Gesamtkapazität der Warteschlange sind durch Kernel-Parameter (/proc/sys/kernel/msgmax, msgmnb) begrenzt und können unter Last zu blockierenden Aufrufen führen, wenn die Warteschlange voll ist.