Signatur
Beschreibung
curl_multi_getcontent() wird zusammen mit der cURL-Multi-Schnittstelle verwendet, um nach dem parallelen Ausführen mehrerer HTTP-Anfragen den Antwort-Inhalt eines einzelnen Handles abzurufen. Die Funktion entspricht dem Rückgabewert, den curl_exec() bei einem einzelnen Handle mit gesetztem CURLOPT_RETURNTRANSFER liefern würde.
Voraussetzung ist, dass die Option CURLOPT_RETURNTRANSFER für das jeweilige Handle auf true gesetzt wurde, bevor es dem Multi-Handle hinzugefügt wird. Andernfalls wird der Inhalt direkt ausgegeben und die Funktion gibt null zurück.
Typischer Einsatzbereich ist das gleichzeitige Abrufen mehrerer URLs (z. B. API-Aufrufe, Web-Scraping), wobei nach Abschluss aller Anfragen jedes Handle einzeln mit dieser Funktion ausgewertet wird.
Die Funktion ist nur sinnvoll nach einem vollständig abgelaufenen curl_multi_exec()-Zyklus, wenn alle Transfers abgeschlossen sind. Für Fehlerbehandlung sollte zusätzlich curl_error() auf dem einzelnen Handle geprüft werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $handle Pflicht | CurlHandle | Ein einzelnes cURL-Handle, das zuvor mit curl_init() erstellt und einem Multi-Handle via curl_multi_add_handle() hinzugefügt wurde. |
Rückgabewert
CURLOPT_RETURNTRANSFER gesetzt war und der Transfer erfolgreich war. Gibt null zurück, wenn CURLOPT_RETURNTRANSFER nicht gesetzt wurde.Beispiele
Mehrere URLs parallel abrufen und Inhalte auslesen
<?php
$urls = [
'https://httpbin.org/get?id=1',
'https://httpbin.org/get?id=2',
'https://httpbin.org/get?id=3',
];
$multiHandle = curl_multi_init();
$handles = [];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_multi_add_handle($multiHandle, $ch);
$handles[] = $ch;
}
// Alle Transfers parallel ausführen
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($status === CURLM_OK) {
curl_multi_select($multiHandle);
}
} while ($running > 0 && $status === CURLM_OK);
// Inhalte abrufen und Handles aufräumen
foreach ($handles as $ch) {
$content = curl_multi_getcontent($ch);
$error = curl_error($ch);
if ($error) {
echo "Fehler: " . $error . PHP_EOL;
} else {
echo "Antwort-Länge: " . strlen($content) . " Bytes" . PHP_EOL;
}
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
curl_multi_close($multiHandle);
Inhalt ohne CURLOPT_RETURNTRANSFER – null als Rückgabe
<?php
$multiHandle = curl_multi_init();
$ch = curl_init('https://httpbin.org/get');
// CURLOPT_RETURNTRANSFER wird NICHT gesetzt
curl_multi_add_handle($multiHandle, $ch);
$running = null;
do {
curl_multi_exec($multiHandle, $running);
curl_multi_select($multiHandle);
} while ($running > 0);
$content = curl_multi_getcontent($ch);
var_dump($content); // NULL, da CURLOPT_RETURNTRANSFER nicht gesetzt
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
curl_multi_close($multiHandle);
// Wichtig · Fallstricke
Reihenfolge beachten: CURLOPT_RETURNTRANSFER muss gesetzt werden, bevor das Handle dem Multi-Handle hinzugefügt wird. Nachträgliches Setzen hat keine Wirkung auf laufende Transfers.
Fehlerbehandlung: Ein leerer String als Rückgabe bedeutet nicht zwingend einen Fehler – prüfe immer zusätzlich mit curl_error($ch) und curl_getinfo($ch, CURLINFO_HTTP_CODE).
Speicher: Bei vielen parallelen Anfragen mit großen Antworten kann der Speicherbedarf erheblich steigen, da alle Inhalte im RAM gehalten werden. Ggf. besser mit Streaming-Optionen (CURLOPT_FILE) arbeiten.