Start · Sprachen · PHP · Referenz · CurlMultiHandle

CurlMultiHandle

Klasse

Opake Klasse, die ab PHP 8.0.0 eine <code>curl_multi</code>-Ressource ersetzt und mehrere parallele cURL-Übertragungen verwaltet.

seit PHP 8.0.0 Kategorie: http

Signatur

class CurlMultiHandle

Beschreibung

CurlMultiHandle ist eine vollständig opake Klasse, die in PHP 8.0 eingeführt wurde, um den bisherigen Ressource-Typ curl_multi zu ersetzen. Instanzen dieser Klasse werden ausschließlich von curl_multi_init() erzeugt und können nicht direkt instantiiert werden. Sie repräsentieren intern ein Multi-Handle, das mehrere einzelne cURL-Handles (CurlHandle) gleichzeitig verwaltet.

Der Hauptanwendungsfall ist das parallele Ausführen mehrerer HTTP-Anfragen, ohne dass jede Anfrage auf die vorherige warten muss. Damit lassen sich z. B. API-Aufrufe an mehrere Endpunkte deutlich effizienter abwickeln als bei sequenziellem Vorgehen. Das Multi-Handle übernimmt die Koordination aller angehängten Einzel-Handles über eine Ereignisschleife.

Der typische Arbeitsablauf sieht so aus: Zunächst wird mit curl_multi_init() ein Multi-Handle erstellt, dann werden mit curl_multi_add_handle() beliebig viele CurlHandle-Objekte hinzugefügt. Die Übertragung wird durch wiederholte Aufrufe von curl_multi_exec() in einer Schleife vorangetrieben, und mit curl_multi_select() kann auf Aktivität gewartet werden. Nach Abschluss werden die Einzel-Handles mit curl_multi_remove_handle() entfernt und das Multi-Handle mit curl_multi_close() geschlossen.

Da die Klasse vollständig opak ist, besitzt sie keine öffentlichen Eigenschaften oder Methoden. Alle Operationen erfolgen über die zugehörigen curl_multi_*-Funktionen. Ab PHP 8.0 erzeugen diese Funktionen Typfehler, wenn eine Variable übergeben wird, die kein CurlMultiHandle-Objekt enthält.

Beispiele

Mehrere HTTP-Anfragen parallel ausführen

<?php
$urls = [
    'https://httpbin.org/get?q=1',
    'https://httpbin.org/get?q=2',
    'https://httpbin.org/get?q=3',
];

// Multi-Handle erstellen
$multiHandle = curl_multi_init();
$curlHandles = [];

foreach ($urls as $i => $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[$i] = $ch;
}

// Alle Anfragen gleichzeitig ausführen
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);
    if ($running) {
        curl_multi_select($multiHandle);
    }
} while ($running > 0 && $status === CURLM_OK);

// Ergebnisse auslesen
foreach ($curlHandles as $i => $ch) {
    $response = curl_multi_getcontent($ch);
    echo "Antwort $i: " . strlen($response) . " Bytes" . PHP_EOL;
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

curl_multi_close($multiHandle);
Antwort 0: 312 Bytes Antwort 1: 312 Bytes Antwort 2: 312 Bytes

Typ-Prüfung mit instanceof (PHP 8.0+)

<?php
$multiHandle = curl_multi_init();

// Typprüfung mit instanceof
if ($multiHandle instanceof CurlMultiHandle) {
    echo 'Gültiges CurlMultiHandle-Objekt erhalten.' . PHP_EOL;
}

// var_dump zeigt den Objekttyp
var_dump($multiHandle);

curl_multi_close($multiHandle);
Gültiges CurlMultiHandle-Objekt erhalten. object(CurlMultiHandle)#1 (0) { }

// Wichtig · Fallstricke

Migration von PHP 7 zu PHP 8: In PHP 7 und früher lieferte curl_multi_init() eine Ressource vom Typ curl_multi. Ab PHP 8.0 wird stattdessen ein CurlMultiHandle-Objekt zurückgegeben. Code, der auf den Ressource-Typ prüft (z. B. is_resource()), muss auf instanceof CurlMultiHandle umgestellt werden.

Speicherverwaltung: Auch wenn PHP Handles bei Skriptende bereinigt, sollte curl_multi_close() explizit aufgerufen werden, um Ressourcen zeitnah freizugeben – insbesondere in lang laufenden Prozessen oder Schleifen.

Fehlerbehandlung: Der Rückgabewert von curl_multi_exec() sollte auf CURLM_OK geprüft werden. Fehler einzelner Handles können über curl_multi_info_read() abgerufen werden, ohne die parallele Übertragung der anderen Handles zu unterbrechen.