Signatur
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);
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);
// 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.