Start · Sprachen · PHP · Referenz · Swoole\Coroutine\Http\Client

Swoole\Coroutine\Http\Client

Klasse

Stellt einen koroutinenfähigen HTTP/HTTPS-Client bereit, der innerhalb von Swoole-Koroutinen nicht-blockierend arbeitet.

seit PHP 4.0.0 Kategorie: misc

Signatur

class Swoole\Coroutine\Http\Client

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

Typ

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();
});
Status: 200 Body: {"args":{"foo":"bar"}, ...}

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();
});
HTTP-Status: 200 Gesendete Daten: {"username":"max","score":42}

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;
    }
});
Anfrage 0: HTTP 200 Anfrage 1: HTTP 200 Anfrage 2: HTTP 200

// 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.