Signatur
Beschreibung
ZookeeperConnectionException ist eine spezialisierte Ausnahme aus der ZooKeeper-PECL-Extension, die ausgelöst wird, sobald Verbindungsprobleme mit dem ZooKeeper-Ensemble auftreten. Typische Ursachen sind ein nicht erreichbarer ZooKeeper-Server, ein Netzwerkausfall, ein abgelaufenes Session-Timeout oder ungültige Verbindungsparameter.
Sie erbt von ZookeeperException, die selbst von RuntimeException abstammt, und lässt sich damit gezielt in einem catch-Block abfangen, ohne andere ZooKeeper-Fehler oder allgemeine PHP-Ausnahmen zu maskieren. Das ermöglicht eine feingranulare Fehlerbehandlung, etwa um automatische Wiederverbindungsversuche oder Fallback-Logik zu implementieren.
Beim Arbeiten mit verteilten Systemen – z. B. Service-Discovery, verteilten Sperren oder Konfigurationsverwaltung via ZooKeeper – ist es ratsam, ZookeeperConnectionException explizit zu behandeln, da Verbindungsabbrüche in Produktionsumgebungen jederzeit auftreten können. Eine robuste Anwendung sollte auf diesen Fehlerfall vorbereitet sein und entsprechende Retry- oder Alerting-Mechanismen besitzen.
Beispiele
Verbindungsfehler gezielt abfangen
<?php
use Zookeeper;
use ZookeeperConnectionException;
use ZookeeperException;
try {
// Verbindung zu einem nicht erreichbaren ZooKeeper-Server
$zk = new Zookeeper('192.0.2.1:2181', null, 3000);
$data = $zk->get('/myapp/config');
echo $data;
} catch (ZookeeperConnectionException $e) {
// Gezielt auf Verbindungsprobleme reagieren
error_log('ZooKeeper-Verbindungsfehler: ' . $e->getMessage());
echo 'Verbindung zum Konfigurationsdienst fehlgeschlagen. Bitte später erneut versuchen.';
} catch (ZookeeperException $e) {
// Alle anderen ZooKeeper-Fehler
error_log('ZooKeeper-Fehler: ' . $e->getMessage());
}
Wiederholungsversuch bei Verbindungsabbruch
<?php
use Zookeeper;
use ZookeeperConnectionException;
function connectWithRetry(string $hosts, int $maxRetries = 3): Zookeeper {
$attempt = 0;
while ($attempt < $maxRetries) {
try {
$zk = new Zookeeper($hosts, null, 5000);
echo "Verbindung hergestellt (Versuch " . ($attempt + 1) . ").\n";
return $zk;
} catch (ZookeeperConnectionException $e) {
$attempt++;
error_log("Verbindungsversuch {$attempt} fehlgeschlagen: " . $e->getMessage());
if ($attempt < $maxRetries) {
sleep(2); // Kurze Wartezeit vor erneutem Versuch
}
}
}
throw new RuntimeException("ZooKeeper nach {$maxRetries} Versuchen nicht erreichbar.");
}
try {
$zk = connectWithRetry('127.0.0.1:2181');
} catch (RuntimeException $e) {
echo $e->getMessage() . "\n";
}
// Wichtig · Fallstricke
Achtung: Die ZooKeeper-PECL-Extension muss installiert und aktiviert sein (pecl install zookeeper), damit diese Klasse verfügbar ist. Sie ist kein Bestandteil der PHP-Standardbibliothek.
Session-Timeouts können auch bei zunächst erfolgreicher Verbindung auftreten, wenn der ZooKeeper-Server die Session als abgelaufen markiert. In diesem Fall kann ebenfalls eine ZookeeperConnectionException geworfen werden, obwohl die initiale Verbindung erfolgreich war. Es empfiehlt sich daher, Verbindungsfehler nicht nur beim initialen Verbindungsaufbau, sondern auch bei jeder ZooKeeper-Operation abzufangen.