Signatur
Beschreibung
Yar_Server_Packager_Exception ist eine Ausnahme, die von der Yar-Erweiterung geworfen wird, wenn der Server beim Serialisieren bzw. Verpacken von Antwortdaten auf einen Fehler stößt. Yar (Yet Another RPC Framework) verwendet verschiedene Packager wie JSON, Msgpack oder PHP, um Daten zwischen Client und Server zu übertragen.
Ein typischer Auslöser ist die Unfähigkeit des konfigurierten Packagers, die Antwortdaten zu serialisieren – zum Beispiel bei nicht serialisierbaren PHP-Objekten oder wenn ein benötigter Packager (z. B. msgpack) nicht installiert ist. Die Ausnahme erbt von Yar_Server_Exception und damit letztlich von Exception, kann also mit dem normalen try/catch-Mechanismus abgefangen werden.
Um Packaging-Fehler gezielt zu behandeln, empfiehlt es sich, Yar_Server_Packager_Exception explizit zu fangen und dem Client eine verständliche Fehlermeldung zurückzugeben, anstatt den Server mit einem unkontrollierten Fehler abbrechen zu lassen.
Beispiele
Packaging-Exception auf dem Yar-Server abfangen
<?php
// server.php
class MyService {
public function getData(): array {
// Gibt normale Daten zurück
return ['status' => 'ok', 'value' => 42];
}
public function getBrokenData() {
// Gibt eine Ressource zurück – nicht serialisierbar mit JSON-Packager
return fopen('php://memory', 'r');
}
}
try {
$server = new Yar_Server(new MyService());
$server->handle();
} catch (Yar_Server_Packager_Exception $e) {
// Packaging-Fehler explizit abfangen
error_log('Yar Packaging-Fehler: ' . $e->getMessage());
http_response_code(500);
echo json_encode(['error' => 'Packaging fehlgeschlagen: ' . $e->getMessage()]);
} catch (Yar_Server_Exception $e) {
// Allgemeine Yar-Server-Fehler
error_log('Yar Server-Fehler: ' . $e->getMessage());
}
Unterschiedliche Yar-Ausnahmetypen hierarchisch behandeln
<?php
// Hierarchische Fehlerbehandlung für einen Yar-Server
class CalculatorService {
public function divide(float $a, float $b): float {
if ($b === 0.0) {
throw new InvalidArgumentException('Division durch Null ist nicht erlaubt.');
}
return $a / $b;
}
}
try {
$server = new Yar_Server(new CalculatorService());
$server->handle();
} catch (Yar_Server_Packager_Exception $e) {
// Spezifischer Packaging-Fehler
error_log('[Packager] ' . $e->getMessage() . ' (Code: ' . $e->getCode() . ')');
} catch (Yar_Server_Exception $e) {
// Sonstige Server-seitige Yar-Ausnahmen
error_log('[Yar Server] ' . $e->getMessage());
} catch (Exception $e) {
// Alle anderen Ausnahmen
error_log('[Allgemein] ' . $e->getMessage());
}
// Wichtig · Fallstricke
Verfügbarkeit des Packagers prüfen: Wenn der msgpack-Packager konfiguriert ist, muss die PHP-Erweiterung msgpack installiert sein. Fehlt sie, wird eine Yar_Server_Packager_Exception ausgelöst. Prüfen Sie die Erweiterung mit extension_loaded('msgpack').
Nicht serialisierbare Typen: PHP-Ressourcen (z. B. Datei-Handles) sowie Objekte ohne __sleep()- oder __serialize()-Methode können beim Verpacken Fehler verursachen. Stellen Sie sicher, dass alle Rückgabewerte der RPC-Methoden vollständig serialisierbar sind.
Die Klasse selbst bietet keine eigenen Methoden über die von Exception geerbten hinaus (getMessage(), getCode(), getTrace() etc.).