Start · Sprachen · PHP · Referenz · zookeeper_dispatch

zookeeper_dispatch

Funktion

Ruft Callbacks für ausstehende Zookeeper-Operationen auf und verarbeitet alle wartenden Ereignisse.

Kategorie: misc

Signatur

zookeeper_dispatch(): void

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

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück. Sie hat ausschließlich den Nebeneffekt, ausstehende Callbacks auszuführen.

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
}
Knoten existiert noch nicht, warte auf Erstellung... Ereignis eingetreten – Typ: 1, Pfad: /mein/pfad

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";
Wert gelesen: 1.4.2 Dispatch-Schleife beendet.

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