Start · Sprachen · PHP · Referenz · Yar_Client_Transport_Exception

Yar_Client_Transport_Exception

Klasse

Wird ausgelöst, wenn auf der Yar-Clientseite ein Transportfehler auftritt (z. B. Netzwerkproblem, Verbindungsabbruch oder Timeout).

seit PHP 2.0.0 Kategorie: error

Signatur

class Yar_Client_Transport_Exception extends Yar_Client_Exception

Beschreibung

Yar_Client_Transport_Exception ist eine Ausnahme, die von der Yar-Erweiterung geworfen wird, wenn bei der Kommunikation zwischen Client und Server ein Fehler auf Transportebene auftritt. Typische Ursachen sind Netzwerkausfälle, fehlgeschlagene DNS-Auflösung, Verbindungsabbrüche oder abgelaufene Timeouts.

Die Klasse erbt von Yar_Client_Exception und ergänzt damit die Ausnahme-Hierarchie von Yar um transportspezifische Fehlerbehandlung. Mit getCode() lässt sich der zugrunde liegende Fehlercode abfragen, der Aufschluss über die Art des Transportproblems gibt (z. B. YAR_ERR_TRANSPORT).

Im Gegensatz zu Yar_Server_Exception, die Fehler auf Serverseite repräsentiert, steht Yar_Client_Transport_Exception für Fehler, die bereits vor oder während der eigentlichen Protokollkommunikation entstehen – also bevor eine Antwort vom Server empfangen werden konnte.

Das gezielte Abfangen dieser Ausnahme empfiehlt sich, wenn Robustheit gegenüber Netzwerkproblemen erforderlich ist, etwa um automatische Wiederholungsversuche zu implementieren oder dem Benutzer eine aussagekräftige Fehlermeldung anzuzeigen.

Beispiele

Transportfehler beim Yar-RPC-Aufruf abfangen

<?php
// Yar-Client für einen nicht erreichbaren Server konfigurieren
$client = new Yar_Client('http://nicht-erreichbar.example.com/api.php');
$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, 1000); // 1 Sekunde Timeout

try {
    $result = $client->someRemoteMethod('parameter');
    echo 'Ergebnis: ' . $result;
} catch (Yar_Client_Transport_Exception $e) {
    // Transportfehler (Netzwerk, Timeout, Verbindungsabbruch)
    echo 'Transportfehler [Code ' . $e->getCode() . ']: ' . $e->getMessage();
} catch (Yar_Client_Exception $e) {
    // Sonstige Yar-Clientfehler
    echo 'Yar-Clientfehler: ' . $e->getMessage();
}
Transportfehler [Code 4]: Could not connect to host

Wiederholungsversuch bei Transportfehlern

<?php
function callWithRetry(Yar_Client $client, string $method, array $args, int $maxRetries = 3): mixed
{
    $attempt = 0;
    while ($attempt < $maxRetries) {
        try {
            return $client->__call($method, $args);
        } catch (Yar_Client_Transport_Exception $e) {
            $attempt++;
            if ($attempt >= $maxRetries) {
                throw new RuntimeException(
                    "RPC-Aufruf '$method' nach $maxRetries Versuchen fehlgeschlagen: " . $e->getMessage(),
                    $e->getCode(),
                    $e
                );
            }
            // Kurze Wartezeit vor dem nächsten Versuch
            usleep(200000 * $attempt); // 200ms, 400ms, ...
        }
    }
}

$client = new Yar_Client('http://api.example.com/rpc.php');
try {
    $result = callWithRetry($client, 'getUserData', [42]);
    var_dump($result);
} catch (RuntimeException $e) {
    error_log($e->getMessage());
    echo 'Der Dienst ist momentan nicht verfügbar.';
}
Der Dienst ist momentan nicht verfügbar.

// Wichtig · Fallstricke

Fehler-Codes: Der von getCode() zurückgegebene Wert entspricht einer der Yar-Fehlerkonstanten (z. B. YAR_ERR_TRANSPORT, YAR_ERR_REQUEST). Diese Konstanten sind in der Yar-Erweiterung definiert und können zur gezielteren Fehlerunterscheidung herangezogen werden.

Abgrenzung zu anderen Ausnahmen: Nicht alle Yar-Fehler führen zu einer Yar_Client_Transport_Exception. Fehler, die der Server zurückmeldet (z. B. eine nicht existierende Methode), werden als Yar_Server_Exception geworfen. Achte beim Abfangen darauf, beide Typen zu behandeln.

Voraussetzung: Die Klasse steht nur zur Verfügung, wenn die PECL-Erweiterung yar installiert und aktiviert ist. Prüfe die Verfügbarkeit mit extension_loaded('yar').