Signatur
Beschreibung
Zookeeper ist die zentrale Klasse der PHP-Erweiterung php-zookeeper und bildet eine Sitzung (Session) mit einem Apache ZooKeeper-Ensemble ab. Apache ZooKeeper ist ein verteilter Koordinationsdienst, der für Konfigurationsverwaltung, Namensgebung, Synchronisation und Gruppendienste in verteilten Systemen eingesetzt wird.
Über die Zookeeper-Klasse können PHP-Anwendungen Knoten (sogenannte ZNodes) im ZooKeeper-Baum erstellen, lesen, aktualisieren und löschen sowie Watcher registrieren, die asynchron über Änderungen am Baum benachrichtigen. Typische Anwendungsfälle sind Leader-Election, Service-Discovery und verteilte Sperren (Distributed Locks).
Die Klasse wird instanziiert, indem im Konstruktor die Verbindungszeichenfolge zum ZooKeeper-Server übergeben wird. Nach erfolgreicher Verbindung stehen Methoden wie get(), set(), create(), delete(), getChildren() und exists() zur Verfügung, um mit dem Datenbaum zu arbeiten.
Die Erweiterung setzt die native libzookeeper-Bibliothek voraus und ist nicht Teil der PHP-Standarddistribution; sie muss über PECL installiert werden (pecl install zookeeper).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $host Pflicht | string | Verbindungszeichenfolge zum ZooKeeper-Ensemble, z. B. 'localhost:2181' oder 'host1:2181,host2:2181'. |
|
| $watcher_cb | callable|null | null | Optionaler globaler Watcher-Callback, der bei Sitzungsereignissen (z. B. Verbindungsaufbau, -verlust) aufgerufen wird. Signatur: function(int $type, int $state, string $path). |
| $recv_timeout | int | 10000 | Empfangs-Timeout der Sitzung in Millisekunden. Standardmäßig 10 000 ms (10 Sekunden). |
Beispiele
Verbindung herstellen und einen ZNode lesen
<?php
$zk = new Zookeeper('localhost:2181');
// Warten, bis die Verbindung aufgebaut ist
while ($zk->getState() !== Zookeeper::CONNECTED_STATE) {
usleep(500000);
}
// Einen Knoten anlegen (falls nicht vorhanden)
if (!$zk->exists('/mein-knoten')) {
$zk->create('/mein-knoten', 'Hallo ZooKeeper', [
['perms' => Zookeeper::PERM_ALL, 'scheme' => 'world', 'id' => 'anyone']
]);
}
// Wert lesen
$wert = $zk->get('/mein-knoten');
echo $wert; // Hallo ZooKeeper
Watcher für Änderungen an einem Knoten registrieren
<?php
$zk = new Zookeeper('localhost:2181');
while ($zk->getState() !== Zookeeper::CONNECTED_STATE) {
usleep(500000);
}
$watcher = function (int $type, int $state, string $path): void {
echo "Änderung erkannt – Typ: {$type}, Pfad: {$path}\n";
};
// Wert lesen und gleichzeitig Watcher registrieren
$wert = $zk->get('/mein-knoten', $watcher);
echo "Aktueller Wert: {$wert}\n";
// Wert ändern, um den Watcher auszulösen
$zk->set('/mein-knoten', 'Neuer Wert');
// Event-Loop, damit der Watcher feuern kann
sleep(1);
Kindknoten auflisten und Knoten löschen
<?php
$zk = new Zookeeper('localhost:2181');
while ($zk->getState() !== Zookeeper::CONNECTED_STATE) {
usleep(500000);
}
// Mehrere Kindknoten anlegen
foreach (['alpha', 'beta', 'gamma'] as $name) {
$pfad = '/dienste/' . $name;
if (!$zk->exists($pfad)) {
$zk->create($pfad, $name, [
['perms' => Zookeeper::PERM_ALL, 'scheme' => 'world', 'id' => 'anyone']
]);
}
}
// Kinder auflisten
$kinder = $zk->getChildren('/dienste');
sort($kinder);
echo implode(', ', $kinder) . "\n";
// Einen Knoten entfernen
$zk->delete('/dienste/beta');
// Wichtig · Fallstricke
Sicherheit: ZooKeeper-Pfade und -Werte sollten vor der Übergabe validiert werden, da Pfadmanipulationen unbeabsichtigten Zugriff auf andere ZNodes ermöglichen könnten. Für produktive Umgebungen sollte ACL (Access Control List) statt world:anyone verwendet werden.
Verbindungsstatus: Die Verbindung wird asynchron aufgebaut. Direkt nach der Instanziierung ist die Sitzung möglicherweise noch nicht bereit (CONNECTING_STATE). Vor dem ersten Zugriff sollte der Zustand mit getState() geprüft werden.
Watcher feuern nur einmal: Ein über get(), exists() oder getChildren() gesetzter Watcher wird nur für ein einzelnes Ereignis ausgelöst und muss danach neu registriert werden.
PECL-Abhängigkeit: Die Klasse ist nur verfügbar, wenn die PECL-Erweiterung php-zookeeper installiert und in der php.ini aktiviert ist (extension=zookeeper.so). Außerdem muss libzookeeper auf dem System vorhanden sein.