Signatur
Beschreibung
Swoole\Coroutine\Http\Client ist ein vollständig asynchroner, koroutinenfähiger HTTP-Client, der auf Basis des Swoole-Frameworks funktioniert. Er erlaubt es, HTTP- und HTTPS-Anfragen innerhalb von Koroutinen zu senden, ohne den gesamten Prozess zu blockieren. Intern wird dabei Co-I/O verwendet, sodass während des Wartens auf eine Antwort andere Koroutinen weiterarbeiten können.
Der Client unterstützt gängige HTTP-Methoden wie GET, POST, PUT, DELETE sowie WebSocket-Upgrades. Cookies, benutzerdefinierte Header, Datei-Uploads (Multipart) und Keep-Alive-Verbindungen werden ebenfalls unterstützt. Für HTTPS-Verbindungen kann SSL/TLS konfiguriert werden.
Typischer Einsatz ist das Abfragen externer APIs, das Weiterleiten von Anfragen oder das Scrapen von Webseiten innerhalb einer Swoole-basierten Serveranwendung. Im Vergleich zu blockierenden Clients wie cURL in der Standardbibliothek ermöglicht dieser Client deutlich höhere Parallelität ohne zusätzliche Threads.
Wichtig: Die Klasse funktioniert nur innerhalb eines Swoole-Koroutinenkontexts (z. B. Swoole\Coroutine\run() oder innerhalb von go()-Callbacks). Außerhalb eines solchen Kontexts ist das Verhalten undefiniert.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $host Pflicht | string | Hostname oder IP-Adresse des Zielservers, z. B. 'api.example.com' oder '127.0.0.1'. |
|
| $port | int | 80 | Port des Zielservers. Standardmäßig 80 für HTTP und 443 für HTTPS (wenn SSL aktiviert). |
| $ssl | bool | false | Gibt an, ob eine SSL/TLS-verschlüsselte Verbindung verwendet werden soll. Bei true wird HTTPS verwendet. |
Rückgabewert
Beispiele
Einfache GET-Anfrage an eine REST-API
<?php
use Swoole\Coroutine\Http\Client;
use function Swoole\Coroutine\run;
run(function () {
$client = new Client('httpbin.org', 443, true);
$client->setHeaders([
'User-Agent' => 'SwooleClient/1.0',
'Accept' => 'application/json',
]);
$client->set(['timeout' => 5]);
$client->get('/get?foo=bar');
if ($client->statusCode === 200) {
echo 'Status: ' . $client->statusCode . PHP_EOL;
echo 'Body: ' . $client->body . PHP_EOL;
} else {
echo 'Fehler: ' . $client->errCode . ' - ' . $client->errMsg . PHP_EOL;
}
$client->close();
});
POST-Anfrage mit JSON-Daten
<?php
use Swoole\Coroutine\Http\Client;
use function Swoole\Coroutine\run;
run(function () {
$client = new Client('httpbin.org', 443, true);
$client->setHeaders([
'Content-Type' => 'application/json',
'Accept' => 'application/json',
]);
$payload = json_encode(['username' => 'max', 'score' => 42]);
$client->post('/post', $payload);
echo 'HTTP-Status: ' . $client->statusCode . PHP_EOL;
$response = json_decode($client->body, true);
echo 'Gesendete Daten: ' . $response['data'] . PHP_EOL;
$client->close();
});
Parallele HTTP-Anfragen mit mehreren Koroutinen
<?php
use Swoole\Coroutine\Http\Client;
use function Swoole\Coroutine\run;
use Swoole\Coroutine\WaitGroup;
run(function () {
$wg = new WaitGroup();
$results = [];
$urls = ['/get?id=1', '/get?id=2', '/get?id=3'];
foreach ($urls as $index => $path) {
$wg->add();
go(function () use ($wg, $path, $index, &$results) {
$client = new Client('httpbin.org', 443, true);
$client->set(['timeout' => 5]);
$client->get($path);
$results[$index] = $client->statusCode;
$client->close();
$wg->done();
});
}
$wg->wait();
foreach ($results as $i => $status) {
echo "Anfrage $i: HTTP $status" . PHP_EOL;
}
});
// Wichtig · Fallstricke
Nur im Koroutinenkontext: Dieser Client darf ausschließlich innerhalb eines Swoole-Koroutinenkontexts verwendet werden. Der Aufruf außerhalb führt zu unerwartetem Verhalten oder Fehlern.
SSL-Zertifikat-Validierung: Standardmäßig wird das SSL-Zertifikat des Servers verifiziert. Für Testumgebungen mit selbstsignierten Zertifikaten kann die Validierung über $client->set(['ssl_verify_peer' => false]) deaktiviert werden — dies sollte in Produktionsumgebungen jedoch niemals getan werden, da es Man-in-the-Middle-Angriffe ermöglicht.
Keep-Alive und Verbindungswiederverwendung: Standardmäßig bleibt die Verbindung nach einer Anfrage offen (keep_alive). Mehrere sequenzielle Anfragen an denselben Host können dieselbe Instanz wiederverwenden, ohne erneut new Client(...) aufzurufen. Explizites close() beendet die Verbindung.
Timeouts: Ohne explizites Setzen eines Timeouts via $client->set(['timeout' => N]) kann eine Anfrage unbegrenzt lange blockieren. In produktivem Code sollte stets ein Timeout gesetzt werden.