Start · Sprachen · PHP · Referenz · MongoDB\Driver\Exception\ConnectionTimeoutException

MongoDB\Driver\Exception\ConnectionTimeoutException

Klasse

Wird ausgelöst, wenn der Verbindungsaufbau zum MongoDB-Server die konfigurierte Zeitüberschreitung überschreitet.

seit PHP 1.0.0 Kategorie: error

Signatur

class MongoDB\Driver\Exception\ConnectionTimeoutException extends MongoDB\Driver\Exception\ConnectionException

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;
}
Verbindungs-Timeout: Der MongoDB-Server ist nicht rechtzeitig erreichbar. Fehlermeldung: No suitable servers found ... Fehlercode: 0

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;
}
Verbindungsversuch 1 fehlgeschlagen: No suitable servers found ... Verbindungsversuch 2 fehlgeschlagen: No suitable servers found ... Verbindungsversuch 3 fehlgeschlagen: No suitable servers found ... Fehler: MongoDB nach 3 Versuchen nicht erreichbar.

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