Signatur
Beschreibung
MongoDB\Driver\Exception\ConnectionTimeoutException ist eine Ausnahmeklasse, die vom MongoDB-Treiber für PHP geworfen wird, wenn beim Versuch, eine Verbindung zu einem MongoDB-Server herzustellen, das konfigurierte Timeout abläuft. Dies kann auftreten, wenn der Server nicht erreichbar ist, die Netzwerkverbindung zu langsam ist oder ein Firewall-Problem vorliegt.
Die Klasse erbt von MongoDB\Driver\Exception\ConnectionException und implementiert das MongoDB\Driver\Exception\Exception-Interface. Da sie außerdem von RuntimeException abstammt, kann sie wie eine Standard-PHP-Laufzeitausnahme behandelt werden.
Das Timeout für den Verbindungsaufbau kann über den connectTimeoutMS-Parameter in der Verbindungs-URI oder in den Treiberoptionen gesteuert werden. Der Standardwert beträgt 10.000 Millisekunden (10 Sekunden).
Es empfiehlt sich, diese Ausnahme gezielt zu fangen und dem Benutzer eine aussagekräftige Fehlermeldung anzuzeigen, anstatt die rohe Ausnahme weiterzugeben – besonders in Produktionsumgebungen, wo Verbindungsprobleme häufiger auftreten können.
Beispiele
Verbindungs-Timeout abfangen und behandeln
<?php
use MongoDB\Driver\Manager;
use MongoDB\Driver\Exception\ConnectionTimeoutException;
use MongoDB\Driver\Exception\Exception as MongoDBException;
try {
// connectTimeoutMS auf 2 Sekunden setzen
$manager = new Manager(
'mongodb://192.0.2.1:27017', // Nicht erreichbare IP-Adresse
['connectTimeoutMS' => 2000]
);
// Eine Abfrage erzwingt den tatsächlichen Verbindungsaufbau
$query = new MongoDB\Driver\Query([]);
$cursor = $manager->executeQuery('testdb.collection', $query);
} catch (ConnectionTimeoutException $e) {
// Gezieltes Abfangen von Verbindungs-Timeouts
echo 'Verbindungs-Timeout: Der MongoDB-Server ist nicht rechtzeitig erreichbar.' . PHP_EOL;
echo 'Fehlermeldung: ' . $e->getMessage() . PHP_EOL;
echo 'Fehlercode: ' . $e->getCode() . PHP_EOL;
} catch (MongoDBException $e) {
// Sonstige MongoDB-Treiber-Ausnahmen
echo 'MongoDB-Fehler: ' . $e->getMessage() . PHP_EOL;
}
Wiederholungslogik bei Verbindungs-Timeout
<?php
use MongoDB\Driver\Manager;
use MongoDB\Driver\Query;
use MongoDB\Driver\Exception\ConnectionTimeoutException;
function createMongoManager(string $uri, int $maxRetries = 3): Manager
{
$attempt = 0;
while ($attempt < $maxRetries) {
try {
$manager = new Manager($uri, ['connectTimeoutMS' => 3000]);
// Verbindung testen
$query = new Query([]);
$manager->executeQuery('admin.system.users', $query);
return $manager;
} catch (ConnectionTimeoutException $e) {
$attempt++;
echo "Verbindungsversuch {$attempt} fehlgeschlagen: " . $e->getMessage() . PHP_EOL;
if ($attempt >= $maxRetries) {
throw new RuntimeException(
"MongoDB nach {$maxRetries} Versuchen nicht erreichbar.",
0,
$e
);
}
// Kurze Pause vor dem nächsten Versuch
sleep(2);
}
}
}
try {
$manager = createMongoManager('mongodb://192.0.2.1:27017');
echo 'Verbindung erfolgreich hergestellt.' . PHP_EOL;
} catch (RuntimeException $e) {
echo 'Fehler: ' . $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Lazy Connection: Der MongoDB-Treiber stellt die Verbindung erst beim ersten tatsächlichen Datenbankzugriff her (Lazy Evaluation). Das bloße Erstellen eines Manager-Objekts löst noch keine Verbindung aus – und daher auch keine ConnectionTimeoutException.
connectTimeoutMS vs. socketTimeoutMS: connectTimeoutMS betrifft nur den initialen Verbindungsaufbau. Für Zeitüberschreitungen bei einzelnen Netzwerkoperationen auf einer bereits bestehenden Verbindung gilt socketTimeoutMS. Beide Werte sollten sorgfältig auf die Anforderungen der Anwendung abgestimmt werden.
Ausnahmen-Hierarchie: Da ConnectionTimeoutException von ConnectionException erbt, kann sie auch durch das Abfangen von ConnectionException behandelt werden. Für eine spezifischere Fehlerbehandlung empfiehlt sich jedoch das gezielte Abfangen von ConnectionTimeoutException.