Signatur
Beschreibung
msg_queue_exists() ermöglicht es, vor dem Öffnen oder Erstellen einer Nachrichten-Warteschlange zu prüfen, ob bereits eine Warteschlange mit dem gegebenen Schlüssel im System vorhanden ist. Die Funktion gehört zur System-V-IPC-Erweiterung (Inter-Process Communication) von PHP.
Diese Funktion ist besonders nützlich, wenn mehrere Prozesse oder Skripte gemeinsam eine Warteschlange nutzen und vermieden werden soll, versehentlich eine neue Warteschlange zu erzeugen oder eine unerwartete Situation mit msg_get_queue() zu provozieren. Mit der Prüfung lässt sich gezielt entscheiden, ob msg_get_queue() im Öffnungs- oder Erstellungsmodus aufgerufen werden soll.
Der Schlüssel ($key) ist ein ganzzahliger IPC-Schlüssel, der z. B. mit ftok() aus einem Dateinamen und einem Projektzeichen erzeugt werden kann. Nur auf Unix-ähnlichen Systemen mit entsprechender Kernelunterstützung verfügbar; unter Windows steht diese Funktion nicht zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key Pflicht | int | Der ganzzahlige IPC-Schlüssel der Warteschlange, deren Existenz geprüft werden soll. Typischerweise mit ftok() erzeugt. |
Rückgabewert
true zurück, wenn eine Nachrichten-Warteschlange mit dem angegebenen Schlüssel existiert, andernfalls false.Beispiele
Existenz einer Warteschlange prüfen vor dem Öffnen
<?php
// Schlüssel aus Datei und Projektzeichen erzeugen
$key = ftok(__FILE__, 'A');
if (msg_queue_exists($key)) {
echo "Warteschlange existiert bereits – wird geöffnet.\n";
$queue = msg_get_queue($key);
} else {
echo "Warteschlange existiert nicht – wird neu erstellt.\n";
$queue = msg_get_queue($key, 0666);
}
// Beispiel-Nachricht senden
msg_send($queue, 1, 'Hallo Welt');
// Nachricht empfangen
msg_receive($queue, 1, $msgtype, 1024, $message);
echo "Empfangen: " . $message . "\n";
// Warteschlange entfernen
msg_remove_queue($queue);
Sicherheitscheck: Warteschlange nur entfernen, wenn sie existiert
<?php
$key = ftok('/tmp/myapp.lock', 'Q');
if (msg_queue_exists($key)) {
$queue = msg_get_queue($key);
$info = msg_stat_queue($queue);
echo "Warteschlange enthält {$info['msg_qnum']} Nachrichten.\n";
msg_remove_queue($queue);
echo "Warteschlange wurde entfernt.\n";
} else {
echo "Keine Warteschlange mit diesem Schlüssel vorhanden.\n";
}
// Wichtig · Fallstricke
Plattformverfügbarkeit: msg_queue_exists() ist nur auf Unix-ähnlichen Betriebssystemen verfügbar und erfordert, dass PHP mit System-V-IPC-Unterstützung kompiliert wurde (--enable-sysvmsg). Unter Windows steht die Funktion nicht zur Verfügung.
Race Condition: Da zwischen dem Aufruf von msg_queue_exists() und dem anschließenden msg_get_queue() eine Zeitspanne liegt, kann es in seltenen Fällen zu Race Conditions kommen – besonders wenn mehrere Prozesse gleichzeitig dieselbe Warteschlange anlegen oder löschen. Für kritische Szenarien sollte eine geeignete Synchronisationsstrategie (z. B. Semaphore via sem_get()) verwendet werden.