Start · Sprachen · PHP · Referenz · msg_send

msg_send

Funktion

Sendet eine Nachricht an eine POSIX-Nachrichtenwarteschlange (Message Queue) für die Interprozesskommunikation.

seit PHP 4.3.0 Kategorie: misc

Signatur

msg_send(SysvMessageQueue $queue, int $message_type, string|int|float|bool $message, bool $serialize = true, bool $blocking = true, int &$error_code = null): bool

Beschreibung

msg_send() sendet eine Nachricht an eine bestehende POSIX-Nachrichtenwarteschlange, die zuvor mit msg_get_queue() geöffnet oder erstellt wurde. Die Funktion ist Teil der System-V-IPC-Erweiterung und ermöglicht eine asynchrone Kommunikation zwischen verschiedenen Prozessen auf demselben System.

Der Parameter $message_type erlaubt es dem Empfänger, gezielt Nachrichten eines bestimmten Typs aus der Warteschlange zu lesen (z. B. mit msg_receive()). So lassen sich mehrere logische Kommunikationskanäle über eine einzige Warteschlange realisieren.

Standardmäßig wird die Nachricht automatisch mit serialize() serialisiert, sodass beliebige PHP-Werte (Arrays, Objekte) übertragen werden können. Wenn $serialize = false gesetzt wird, muss die Nachricht ein einfacher String, Integer, Float oder Bool sein.

Im blockierenden Modus ($blocking = true) wartet msg_send(), bis ausreichend Speicherplatz in der Warteschlange vorhanden ist. Im nicht-blockierenden Modus gibt die Funktion sofort false zurück und setzt $error_code auf MSG_EAGAIN, wenn die Warteschlange voll ist.

Parameter

Name Typ Default Beschreibung
$queue Pflicht SysvMessageQueue Ein Warteschlangen-Handle, das von msg_get_queue() zurückgegeben wurde.
$message_type Pflicht int Ein positiver Integer-Wert, der den Typ der Nachricht kennzeichnet. Der Empfänger kann anhand dieses Wertes selektiv Nachrichten lesen.
$message Pflicht string|int|float|bool Der zu sendende Nachrichteninhalt. Bei aktivierter Serialisierung können auch Arrays und Objekte übergeben werden.
$serialize bool true Gibt an, ob die Nachricht mit serialize() kodiert werden soll. Muss auf beiden Seiten (Sender und Empfänger) gleich gesetzt sein.
$blocking bool true Wenn true, blockiert die Funktion, bis die Nachricht in die Warteschlange eingereiht werden konnte. Wenn false, kehrt die Funktion sofort zurück, falls die Warteschlange voll ist.
$error_code int null Wird im Fehlerfall mit dem systemspezifischen Fehlercode belegt (z. B. MSG_EAGAIN bei voller Warteschlange im nicht-blockierenden Modus).

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück. Gibt false zurück, wenn die Nachricht nicht gesendet werden konnte (z. B. Warteschlange voll im nicht-blockierenden Modus oder anderer Systemfehler). In diesem Fall enthält $error_code den entsprechenden Fehlercode.

Beispiele

Einfache Nachricht an eine Warteschlange senden

<?php
// Warteschlange erstellen oder öffnen (Schlüssel 1234, erstellen wenn nötig)
$queue = msg_get_queue(1234);

if ($queue === false) {
    die('Warteschlange konnte nicht geöffnet werden.');
}

$messageType = 1;
$message = 'Hallo aus Prozess ' . getmypid();

$result = msg_send($queue, $messageType, $message, true, true, $errorCode);

if ($result) {
    echo "Nachricht erfolgreich gesendet.\n";
} else {
    echo "Fehler beim Senden. Fehlercode: $errorCode\n";
}
Nachricht erfolgreich gesendet.

Komplexe Daten (Array) an eine Warteschlange senden

<?php
// Warteschlange öffnen
$queue = msg_get_queue(ftok('/tmp/myapp', 'A'));

$payload = [
    'job'  => 'resize_image',
    'file' => '/var/uploads/foto.jpg',
    'size' => [800, 600],
];

$sent = msg_send($queue, 2, $payload, true, false, $errorCode);

if (!$sent) {
    if ($errorCode === MSG_EAGAIN) {
        echo "Warteschlange ist voll, bitte später erneut versuchen.\n";
    } else {
        echo "Unbekannter Fehler: $errorCode\n";
    }
} else {
    echo "Job-Payload erfolgreich eingereiht.\n";
}
Job-Payload erfolgreich eingereiht.

// Wichtig · Fallstricke

Plattformverfügbarkeit: msg_send() ist nur auf Unix-ähnlichen Betriebssystemen verfügbar (Linux, macOS usw.) und steht unter Windows nicht zur Verfügung. Die System-V-IPC-Erweiterung muss beim Kompilieren von PHP aktiviert sein (--enable-sysvmsg).

Ressourcen-Verwaltung: Nachrichtenwarteschlangen sind persistente IPC-Ressourcen des Betriebssystems und bleiben auch nach dem Ende des PHP-Prozesses erhalten. Sie müssen explizit mit msg_remove_queue() entfernt werden, um Ressourcenlecks zu vermeiden.

Sicherheit: Die Warteschlange ist über einen numerischen Schlüssel zugänglich. Andere Prozesse desselben Benutzers (oder root) können ebenfalls auf die Warteschlange zugreifen. Sensible Daten sollten vor der Übertragung verschlüsselt werden. Die Deserialisierung empfangener Nachrichten sollte nur aus vertrauenswürdigen Quellen erfolgen, da unsichere Deserialisierung zu Code-Ausführung führen kann.