Start · Sprachen · PHP · Referenz · ZookeeperNoNodeException

ZookeeperNoNodeException

Klasse

Wird geworfen, wenn eine ZooKeeper-Operation auf einem nicht existierenden Knoten ausgeführt wird.

seit PHP 3.4.6 Kategorie: error

Signatur

class ZookeeperNoNodeException extends ZookeeperException

Beschreibung

ZookeeperNoNodeException ist eine spezialisierte Ausnahme der ZooKeeper-PHP-Erweiterung, die immer dann ausgelöst wird, wenn versucht wird, auf einen Znode (Knoten) zuzugreifen, der im ZooKeeper-Verzeichnisbaum nicht vorhanden ist. Dies entspricht dem ZooKeeper-Fehlercode ZNONODE (-101).

Typische Situationen, in denen diese Ausnahme auftritt, sind: Lesen von Daten (get), Setzen von Daten (set), Löschen eines Knotens (delete) oder Abfragen von Kindknoten (getChildren), wenn der angegebene Pfad im ZooKeeper-Ensemble nicht existiert. Auch das Setzen von Watches auf nicht vorhandene Knoten kann diese Exception auslösen.

Da ZooKeeper ein verteiltes System ist, sollte diese Exception immer sauber behandelt werden – ein Knoten kann zwischen dem Prüfen seiner Existenz (exists) und dem tatsächlichen Zugriff durch einen anderen Client gelöscht worden sein (TOCTOU-Problem). Robuster Code fängt ZookeeperNoNodeException explizit ab und reagiert mit einem Wiederholungsversuch oder einer Fallback-Logik.

Die Klasse erbt von ZookeeperException, welche selbst von Exception ableitet, sodass alle Standard-PHP-Ausnahmemethoden wie getMessage(), getCode() und getTrace() verfügbar sind.

Beispiele

Knoten-Daten lesen mit Fehlerbehandlung

<?php
$zk = new Zookeeper('localhost:2181');

try {
    $data = $zk->get('/meine-app/config');
    echo 'Konfiguration: ' . $data;
} catch (ZookeeperNoNodeException $e) {
    echo 'Fehler: Der Knoten existiert nicht. Code: ' . $e->getCode() . PHP_EOL;
    // Fallback: Standardwerte verwenden
    echo 'Verwende Standardkonfiguration.' . PHP_EOL;
} catch (ZookeeperException $e) {
    echo 'Allgemeiner ZooKeeper-Fehler: ' . $e->getMessage() . PHP_EOL;
}
Fehler: Der Knoten existiert nicht. Code: -101 Verwende Standardkonfiguration.

Knoten anlegen, wenn er nicht existiert (Upsert-Muster)

<?php
$zk = new Zookeeper('localhost:2181');
$pfad = '/meine-app/status';
$wert = 'aktiv';

try {
    // Versuche, vorhandenen Knoten zu aktualisieren
    $zk->set($pfad, $wert);
    echo 'Knoten aktualisiert.' . PHP_EOL;
} catch (ZookeeperNoNodeException $e) {
    // Knoten existiert noch nicht – anlegen
    $zk->create(
        $pfad,
        $wert,
        [['perms' => Zookeeper::PERM_ALL, 'scheme' => 'world', 'id' => 'anyone']]
    );
    echo 'Knoten neu angelegt.' . PHP_EOL;
}
Knoten neu angelegt.

// Wichtig · Fallstricke

TOCTOU-Race-Condition: In verteilten Systemen ist ein vorheriger exists()-Check keine Garantie dafür, dass der Knoten beim nachfolgenden Zugriff noch vorhanden ist. Daher ist es Best Practice, direkt auf die ZookeeperNoNodeException zu reagieren, anstatt die Existenz vorab zu prüfen.

Fehlercode: Der Fehlercode dieser Exception ist -101 (entspricht der ZooKeeper-Konstante ZNONODE). Dies kann über $e->getCode() ausgelesen werden.

Voraussetzung: Die ZooKeeper-PHP-Erweiterung (php-zookeeper) muss installiert und aktiviert sein. Sie ist nicht Teil der PHP-Standardinstallation und muss separat über PECL eingebunden werden.