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

Swoole\Http\Client

Klasse

Stellt einen koroutinenfähigen, asynchronen HTTP/HTTPS-Client für die Verwendung innerhalb von Swoole-Koroutinen bereit.

seit PHP 4.0.0 Kategorie: misc

Signatur

class Swoole\Http\Client

Beschreibung

Swoole\Http\Client ist ein hochperformanter HTTP-Client, der speziell für den Einsatz in Swoole-Koroutinen konzipiert wurde. Im Gegensatz zu klassischen PHP-HTTP-Clients (cURL, file_get_contents) blockiert er den PHP-Prozess nicht, sondern gibt die Kontrolle an den Koroutinen-Scheduler zurück, während auf die Antwort des Servers gewartet wird. Dadurch können tausende parallele HTTP-Anfragen mit sehr geringem Ressourcenverbrauch abgewickelt werden.

Der Client unterstützt HTTP/1.1, Keep-Alive, Cookies, Datei-Uploads, WebSockets sowie HTTPS über SSL/TLS. Methoden wie get(), post() und execute() sind koroutinenfreundlich: Sie sehen synchron aus, sind aber intern nicht-blockierend.

Der Client eignet sich ideal für Microservice-Architekturen, API-Aggregatoren oder Web-Scraper, bei denen viele externe HTTP-Aufrufe gleichzeitig und effizient ausgeführt werden müssen. Er wird typischerweise innerhalb eines Swoole\Coroutine\run()-Blocks oder eines Swoole-Servers verwendet.

Achtung: Der Client ist nicht thread-safe und darf nicht über mehrere Koroutinen hinweg gemeinsam genutzt werden. Jede Koroutine sollte eine eigene Client-Instanz verwenden.

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. Standard: 80 für HTTP, 443 für HTTPS.
$ssl bool false Wenn true, wird eine SSL/TLS-verschlüsselte Verbindung (HTTPS) verwendet.

Beispiele

Einfacher GET-Request in einer Koroutine

<?php
use Swoole\Coroutine;
use Swoole\Http\Client;

Coroutine\run(function () {
    $client = new Client('httpbin.org', 443, true);
    $client->setHeaders([
        'User-Agent' => 'SwooleClient/1.0',
        'Accept'     => 'application/json',
    ]);

    $client->get('/get?foo=bar');

    if ($client->statusCode === 200) {
        $data = json_decode($client->body, true);
        echo 'Status: ' . $client->statusCode . PHP_EOL;
        echo 'URL: ' . $data['url'] . PHP_EOL;
    } else {
        echo 'Fehler: ' . $client->errCode . ' - ' . $client->errMsg . PHP_EOL;
    }

    $client->close();
});
Status: 200 URL: https://httpbin.org/get?foo=bar

POST-Request mit JSON-Body

<?php
use Swoole\Coroutine;
use Swoole\Http\Client;

Coroutine\run(function () {
    $client = new Client('httpbin.org', 443, true);
    $client->setHeaders([
        'Content-Type' => 'application/json',
    ]);

    $payload = json_encode(['name' => 'Max', 'age' => 30]);
    $client->setData($payload);
    $client->post('/post');

    echo 'HTTP-Status: ' . $client->statusCode . PHP_EOL;
    $response = json_decode($client->body, true);
    echo 'Empfangene Daten: ' . $response['data'] . PHP_EOL;

    $client->close();
});
HTTP-Status: 200 Empfangene Daten: {"name":"Max","age":30}

Parallele HTTP-Anfragen mit Coroutine\WaitGroup

<?php
use Swoole\Coroutine;
use Swoole\Coroutine\WaitGroup;
use Swoole\Http\Client;

Coroutine\run(function () {
    $wg = new WaitGroup();
    $results = [];

    $urls = ['/get?id=1', '/get?id=2', '/get?id=3'];

    foreach ($urls as $path) {
        $wg->add();
        Coroutine::create(function () use ($path, &$results, $wg) {
            $client = new Client('httpbin.org', 443, true);
            $client->get($path);
            $results[$path] = $client->statusCode;
            $client->close();
            $wg->done();
        });
    }

    $wg->wait();

    foreach ($results as $path => $status) {
        echo $path . ' => HTTP ' . $status . PHP_EOL;
    }
});
/get?id=1 => HTTP 200 /get?id=2 => HTTP 200 /get?id=3 => HTTP 200

// Wichtig · Fallstricke

Wichtige Eigenschaften nach einer Anfrage:

  • $client->statusCode — HTTP-Statuscode (z. B. 200, 404). Bei Verbindungsfehlern ist der Wert negativ.
  • $client->body — Antwort-Body als String.
  • $client->headers — Assoziatives Array mit den Antwort-Headern.
  • $client->errCode und $client->errMsg — Fehlercode und -meldung bei Verbindungsproblemen.

Sicherheitshinweis: Bei HTTPS-Verbindungen wird die SSL-Zertifikatsüberprüfung standardmäßig aktiviert. Deaktivieren Sie diese nicht leichtfertig mit ssl_verify_peer => false, da dies Man-in-the-Middle-Angriffe ermöglicht.

Nur in Koroutinen-Kontext: Dieser Client funktioniert ausschließlich innerhalb von Swoole-Koroutinen korrekt (also in Coroutine\run() oder innerhalb eines Swoole-Servers). Außerhalb eines Koroutinen-Kontexts blockiert er den gesamten Prozess.

Ab Swoole 4.x steht als modernere Alternative Swoole\Coroutine\Http\Client zur Verfügung, der denselben Funktionsumfang bietet, aber dem aktuelleren Namespace-Stil folgt.