Start · Sprachen · PHP · Referenz · Zookeeper

Zookeeper

Klasse

Repräsentiert eine ZooKeeper-Sitzung und ermöglicht die Interaktion mit einem Apache ZooKeeper-Server.

seit PHP 0.1.0 Kategorie: misc

Signatur

class Zookeeper

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
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);
Aktueller Wert: Hallo ZooKeeper Änderung erkannt – Typ: 3, Pfad: /mein-knoten

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');
alpha, beta, gamma

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