Start · Sprachen · PHP · Referenz · curl_multi_getcontent

curl_multi_getcontent

Funktion

Gibt den Antwort-Inhalt eines einzelnen cURL-Handles zurück, das in einem Multi-Handle ausgeführt wurde – sofern <code>CURLOPT_RETURNTRANSFER</code> gesetzt ist.

seit PHP 5.0.0 Kategorie: http

Signatur

curl_multi_getcontent(CurlHandle $handle): ?string

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

Typ
?string
Beschreibung
Gibt den Antwort-Inhalt als String zurück, wenn 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);
Antwort-Länge: 312 Bytes Antwort-Länge: 312 Bytes Antwort-Länge: 312 Bytes

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);
NULL

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