Signatur
Beschreibung
Swoole\Http\Response ist die Antwort-Klasse des asynchronen Swoole-HTTP-Servers. Eine Instanz dieser Klasse wird automatisch bei jedem eingehenden HTTP-Request als zweiter Parameter an den Request-Handler übergeben. Sie kapselt alle Operationen, die zum Aufbau und Senden einer HTTP-Antwort notwendig sind – darunter Status-Code, Header, Cookies und Body-Daten.
Im Gegensatz zu klassischen PHP-Antwortmechanismen (z. B. header(), echo) arbeitet Swoole\Http\Response vollständig event-getrieben und nicht-blockierend. Jede Antwort muss explizit mit end() abgeschlossen werden, da Swoole die Verbindung sonst offen hält. Nach dem Aufruf von end() ist das Objekt nicht mehr verwendbar.
Für das Streaming großer Dateien steht sendfile() zur Verfügung, während write() Chunks in einem HTTP-Chunked-Transfer ermöglicht, bevor end() aufgerufen wird. Cookies können mit cookie() oder rawcookie() gesetzt werden; Header lassen sich über header() und setStatusCode() konfigurieren.
Die Klasse lässt sich nicht manuell instanziieren – Instanzen werden ausschließlich vom Swoole-HTTP-Server erzeugt und an den definierten Callback weitergereicht. Die korrekte Lebensdauer der Instanz ist an den jeweiligen Request-Lebenszyklus gebunden.
Beispiele
Einfacher HTTP-Server mit Swoole\Http\Response
<?php
$server = new Swoole\Http\Server('0.0.0.0', 9501);
$server->on('request', function (Swoole\Http\Request $request, Swoole\Http\Response $response) {
// HTTP-Statuscode setzen
$response->setStatusCode(200);
// Antwort-Header setzen
$response->header('Content-Type', 'text/html; charset=utf-8');
$response->header('X-Powered-By', 'Swoole');
// Cookie setzen
$response->cookie('session_id', bin2hex(random_bytes(16)), time() + 3600, '/');
// Body senden und Verbindung schließen
$response->end('<h1>Hallo von Swoole!</h1>');
});
$server->start();
Chunked-Transfer mit write() und end()
<?php
$server = new Swoole\Http\Server('0.0.0.0', 9502);
$server->on('request', function (Swoole\Http\Request $request, Swoole\Http\Response $response) {
$response->header('Content-Type', 'text/plain; charset=utf-8');
// Ersten Chunk senden
$response->write("Chunk 1: Erster Teil der Antwort\n");
// Zweiten Chunk senden
$response->write("Chunk 2: Zweiter Teil der Antwort\n");
// Abschluss des Streams — optionaler finaler Inhalt
$response->end("Chunk 3: Fertig.");
});
$server->start();
Datei per sendfile() ausliefern
<?php
$server = new Swoole\Http\Server('0.0.0.0', 9503);
$server->on('request', function (Swoole\Http\Request $request, Swoole\Http\Response $response) {
$file = '/var/www/files/beispiel.pdf';
if (!file_exists($file)) {
$response->setStatusCode(404);
$response->end('Datei nicht gefunden.');
return;
}
$response->header('Content-Type', 'application/pdf');
// sendfile() sendet die Datei und schließt die Verbindung automatisch
$response->sendfile($file);
});
$server->start();
JSON-API-Antwort senden
<?php
$server = new Swoole\Http\Server('0.0.0.0', 9504);
$server->on('request', function (Swoole\Http\Request $request, Swoole\Http\Response $response) {
$data = [
'status' => 'ok',
'message' => 'Anfrage erfolgreich verarbeitet',
'data' => ['user_id' => 42, 'name' => 'Max Mustermann'],
];
$response->setStatusCode(200);
$response->header('Content-Type', 'application/json; charset=utf-8');
$response->end(json_encode($data, JSON_UNESCAPED_UNICODE));
});
$server->start();
// Wichtig · Fallstricke
Wichtig: Nach dem Aufruf von end() oder sendfile() darf das Response-Objekt nicht mehr verwendet werden. Weitere Methodenaufrufe auf einer bereits beendeten Antwort führen zu Warnungen oder werden still ignoriert.
Kein Output-Buffering: PHP-Standardfunktionen wie echo, print, header() oder setcookie() haben in Swoole-Kontexten keine Wirkung auf die HTTP-Antwort. Ausschließlich die Methoden der Swoole\Http\Response-Instanz sind zu verwenden.
Coroutine-Kontext: In Swoole-Coroutinen können mehrere Requests gleichzeitig bearbeitet werden. Es ist darauf zu achten, dass die korrekte $response-Instanz verwendet wird und nicht versehentlich eine Instanz aus einem anderen Coroutine-Kontext.
Redirect: Für HTTP-Redirects steht die Methode redirect() bereit (ab Swoole 4.2+), die Location-Header und Statuscode (301/302) automatisch setzt und die Verbindung beendet.
Sicherheit bei Cookies: Sensible Cookies sollten mit den Flags HttpOnly und Secure gesetzt werden. rawcookie() überträgt den Wert ohne URL-Enkodierung – hier ist auf Sonderzeichen und potenzielle Header-Injection zu achten.