Start · Sprachen · PHP · Referenz · msg_remove_queue

msg_remove_queue

Funktion

Entfernt eine System-V-Nachrichten-Warteschlange und gibt alle zugehörigen Ressourcen des Betriebssystems frei.

seit PHP 4.3.0 Kategorie: misc

Signatur

msg_remove_queue(SysvMessageQueue $queue): bool

Beschreibung

msg_remove_queue() löscht eine zuvor mit msg_get_queue() erstellte oder geöffnete System-V-Nachrichten-Warteschlange dauerhaft aus dem Betriebssystem. Dabei werden alle noch in der Warteschlange befindlichen Nachrichten verworfen und die zugehörigen Kernel-Ressourcen freigegeben.

Die Funktion ist nur auf Unix-artigen Systemen verfügbar, die System-V-IPC unterstützen (Linux, macOS, BSD usw.). Unter Windows steht sie nicht zur Verfügung. Sie wird typischerweise am Ende eines Prozesses aufgerufen, der als Ersteller der Warteschlange gilt, um Ressourcenlecks auf Betriebssystemebene zu verhindern.

Im Gegensatz zu Dateien werden System-V-IPC-Ressourcen nicht automatisch beim Prozessende bereinigt – sie bleiben bestehen, bis sie explizit entfernt oder das System neugestartet wird. Deshalb ist der Aufruf von msg_remove_queue() nach der letzten Verwendung besonders wichtig.

Die Anzahl verfügbarer Warteschlangen ist systemweit begrenzt (typischerweise über /proc/sys/kernel/msgmni konfigurierbar). Nicht freigegebene Warteschlangen können dazu führen, dass neue Warteschlangen nicht mehr erstellt werden können.

Parameter

Name Typ Default Beschreibung
$queue Pflicht SysvMessageQueue Das Warteschlangen-Handle, das von msg_get_queue() zurückgegeben wurde und gelöscht werden soll.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Warteschlange erfolgreich entfernt wurde. Gibt false zurück, wenn ein Fehler auftritt, z. B. wenn die Warteschlange bereits entfernt wurde oder der aufrufende Prozess nicht die notwendigen Berechtigungen besitzt.

Beispiele

Warteschlange erstellen, verwenden und anschließend entfernen

<?php
// Einen eindeutigen IPC-Schlüssel aus einer Datei generieren
$key = ftok('/tmp/my_app_queue', 'A');

// Warteschlange öffnen oder erstellen
$queue = msg_get_queue($key, 0666);

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

// Nachricht senden
$result = msg_send($queue, 1, 'Hallo aus dem Producer-Prozess', false, true, $errcode);
if (!$result) {
    echo "Fehler beim Senden: " . $errcode . PHP_EOL;
}

// Nachricht empfangen
$msgtype = 0;
$message = '';
msg_receive($queue, 0, $msgtype, 2048, $message, false, 0, $errcode);
echo "Empfangen (Typ $msgtype): $message" . PHP_EOL;

// Warteschlange nach Benutzung entfernen
if (msg_remove_queue($queue)) {
    echo "Warteschlange erfolgreich entfernt." . PHP_EOL;
} else {
    echo "Fehler beim Entfernen der Warteschlange." . PHP_EOL;
}
?>
Empfangen (Typ 1): Hallo aus dem Producer-Prozess Warteschlange erfolgreich entfernt.

Sicheres Aufräumen mit register_shutdown_function

<?php
$key = ftok('/tmp/worker_queue', 'W');
$queue = msg_get_queue($key, 0600);

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

// Warteschlange beim Skriptende automatisch entfernen
register_shutdown_function(function () use ($queue) {
    if (msg_queue_exists($queue->getId() ?? 0)) {
        msg_remove_queue($queue);
        echo "Shutdown: Warteschlange bereinigt." . PHP_EOL;
    }
});

// Arbeitsaufgaben verarbeiten
for ($i = 1; $i <= 3; $i++) {
    msg_send($queue, 1, "Aufgabe $i", false);
}

$msgtype = 0;
$msg = '';
while (msg_receive($queue, 0, $msgtype, 1024, $msg, false, MSG_IPC_NOWAIT, $err)) {
    echo "Verarbeite: $msg" . PHP_EOL;
}

// Skriptende löst register_shutdown_function aus
?>
Verarbeite: Aufgabe 1 Verarbeite: Aufgabe 2 Verarbeite: Aufgabe 3 Shutdown: Warteschlange bereinigt.

// Wichtig · Fallstricke

Ressourcenlecks: System-V-IPC-Objekte (Warteschlangen, Shared Memory, Semaphore) werden vom Betriebssystem nicht automatisch beim Prozessende freigegeben. Vergisst man msg_remove_queue() aufzurufen, bleibt die Warteschlange dauerhaft im Kernel bestehen und belegt Systemressourcen. Mit dem Befehl ipcs -q können verwaiste Warteschlangen aufgelistet und mit ipcrm -q <id> manuell entfernt werden.

Berechtigungen: Nur der Ersteller der Warteschlange oder der Superuser (root) können die Warteschlange entfernen. Andere Prozesse erhalten einen Berechtigungsfehler.

Plattform: Diese Funktion steht ausschließlich auf Unix-artigen Systemen zur Verfügung. Auf Windows-Systemen existiert sie nicht. PHP muss mit --enable-sysvmsg kompiliert worden sein (standardmäßig bei den meisten Linux-Distributionen aktiv).

PHP 8.0: Ab PHP 8.0 verwendet der Parameter den Typ SysvMessageQueue anstelle der älteren resource-Typisierung.