Signatur
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();
}
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.';
}
// 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').