Signatur
Beschreibung
zookeeper_dispatch() ist eine prozedurale Hilfsfunktion der PHP-Zookeeper-Erweiterung, die alle ausstehenden Callbacks für asynchrone Zookeeper-Operationen aufruft. Sie muss periodisch aufgerufen werden, damit Watcher-Callbacks und asynchrone Antworten tatsächlich ausgeführt werden.
Apache ZooKeeper arbeitet intern mit einem Event-Loop-Modell. Da PHP typischerweise synchron und ohne eigene Event-Loop läuft, müssen ausstehende Ereignisse (z. B. Watcher-Benachrichtigungen, asynchrone Gets oder Exists-Aufrufe) manuell durch den Aufruf von zookeeper_dispatch() abgearbeitet werden. Ohne diesen Aufruf würden registrierte Callbacks niemals ausgeführt.
Die Funktion ist besonders nützlich in Lang-Lauf-Skripten (CLI-Daemons, Worker-Prozesse), bei denen ZooKeeper-Watcher überwacht werden sollen. Sie sollte in einer Schleife aufgerufen werden, um kontinuierlich auf Ereignisse zu reagieren.
- Verarbeitet intern aufgelaufene I/O-Ereignisse der ZooKeeper-Verbindung.
- Löst registrierte Watcher-Callbacks aus, falls deren Bedingungen eingetreten sind.
- Sollte in einer Polling-Schleife mit kurzen Schlaf-Intervallen verwendet werden.
Rückgabewert
Beispiele
Watcher-Callback mit periodischem Dispatch in einer Polling-Schleife
<?php
$zk = new Zookeeper('localhost:2181');
// Watcher-Callback registrieren
$watcher = function($type, $state, $path) {
echo "Ereignis eingetreten – Typ: $type, Pfad: $path\n";
};
// Prüfen, ob ein Knoten existiert, und dabei Watcher setzen
$exists = $zk->exists('/mein/pfad', $watcher);
if ($exists) {
echo "Knoten existiert bereits.\n";
} else {
echo "Knoten existiert noch nicht, warte auf Erstellung...\n";
}
// Endlosschleife: Dispatch aufrufen, um Callbacks zu verarbeiten
while (true) {
zookeeper_dispatch();
usleep(100000); // 100 ms warten
}
Asynchrones Abrufen von Daten mit Callback und Dispatch
<?php
$zk = new Zookeeper('localhost:2181');
// Asynchronen Get-Aufruf mit Callback registrieren
$zk->getAsync('/config/version', function($rc, $value) {
if ($rc === Zookeeper::OK) {
echo "Wert gelesen: $value\n";
} else {
echo "Fehler beim Lesen, Code: $rc\n";
}
});
// Dispatch aufrufen, damit der Callback verarbeitet wird
$start = time();
while (time() - $start < 5) {
zookeeper_dispatch();
usleep(50000); // 50 ms
}
echo "Dispatch-Schleife beendet.\n";
// Wichtig · Fallstricke
Blocking vs. Non-Blocking: zookeeper_dispatch() selbst blockiert nicht – es verarbeitet nur sofort verfügbare Ereignisse. Ohne eine Schleife mit Wartezeit (z. B. usleep()) entsteht Busy-Waiting, das die CPU unnötig belastet.
Thread-Sicherheit: Die Zookeeper-C-Bibliothek verwendet intern einen eigenen I/O-Thread. zookeeper_dispatch() stellt sicher, dass PHP-seitige Callbacks sicher im Hauptthread ausgeführt werden. Callbacks sollten daher nicht direkt aus mehreren PHP-Threads heraus aufgerufen werden.
Verfügbarkeit: Die Funktion ist nur verfügbar, wenn die PHP-Erweiterung php-zookeeper installiert ist. Sie ist nicht Teil der PHP-Standardinstallation. Die genaue Verfügbarkeit kann je nach Version der Erweiterung variieren.