Start · Sprachen · PHP · Referenz · SysvMessageQueue

SysvMessageQueue

Klasse

Repräsentiert eine System-V-Nachrichtenwarteschlange und kapselt den zugehörigen Ressource-Handle als Objekt.

seit PHP 8.0.0 Kategorie: misc

Signatur

class SysvMessageQueue

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);
Nachricht erfolgreich gesendet. Empfangener Job: resize_image Datei: photo.jpg

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";
}
Kind empfängt: Hallo vom Eltern-Prozess Eltern-Prozess fertig.

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