Start · Sprachen · PHP · Referenz · curl_multi_info_read

curl_multi_info_read

Funktion

Liest Statusinformationen über abgeschlossene Transfers aus einem cURL-Multi-Handle aus.

seit PHP 5.2.0 Kategorie: http

Signatur

curl_multi_info_read(CurlMultiHandle $multi_handle, int &$queued_messages = null): array|false

Beschreibung

curl_multi_info_read() wird verwendet, um nach dem Aufruf von curl_multi_exec() zu prüfen, ob einzelne Transfers innerhalb eines Multi-Handles abgeschlossen wurden und welchen Status sie haben. Die Funktion gibt ein assoziatives Array mit Informationen über den nächsten abgeschlossenen Transfer zurück oder false, wenn keine weiteren Nachrichten vorhanden sind.

Das zurückgegebene Array enthält den Schlüssel msg (immer CURLMSG_DONE wenn ein Transfer fertig ist), result (den cURL-Fehlercode oder CURLE_OK) und handle (das einzelne cURL-Handle, das den Transfer durchgeführt hat). Über handle lässt sich mit curl_getinfo() der Antwortcode und weitere Details abrufen.

Der optionale Parameter queued_messages wird per Referenz übergeben und enthält nach dem Aufruf die Anzahl der noch wartenden Nachrichten in der Warteschlange. Damit lässt sich eine Schleife effizient steuern, ohne curl_multi_info_read() unnötig oft aufzurufen.

Diese Funktion ist besonders nützlich, wenn mehrere HTTP-Anfragen parallel ausgeführt werden und nach der Ausführung selektiv auf Fehler oder Ergebnisse einzelner Requests geprüft werden soll.

Parameter

Name Typ Default Beschreibung
$multi_handle Pflicht CurlMultiHandle Ein gültiges cURL-Multi-Handle, das zuvor mit curl_multi_init() erstellt wurde.
$queued_messages int null Wird per Referenz übergeben und enthält nach dem Aufruf die Anzahl der noch in der Warteschlange befindlichen Nachrichten.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein assoziatives Array mit den Schlüsseln msg (Nachrichtentyp, z. B. CURLMSG_DONE), result (cURL-Statuscode, z. B. CURLE_OK) und handle (das betreffende cURL-Einzel-Handle) zurück. Gibt false zurück, wenn keine weiteren Nachrichten in der Warteschlange vorhanden sind.

Beispiele

Mehrere URLs parallel abrufen und Ergebnisse 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 starten
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);
    if ($status > CURLM_OK) {
        break;
    }
    // Auf Aktivität warten, um CPU-Last zu reduzieren
    curl_multi_select($multiHandle);
} while ($running > 0);

// Ergebnisse der einzelnen Transfers auslesen
while ($info = curl_multi_info_read($multiHandle, $queued)) {
    $handle = $info['handle'];
    if ($info['result'] === CURLE_OK) {
        $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
        $url = curl_getinfo($handle, CURLINFO_EFFECTIVE_URL);
        echo "URL: $url — HTTP-Status: $httpCode\n";
    } else {
        echo "Fehler bei Transfer: " . curl_strerror($info['result']) . "\n";
    }
    echo "Verbleibende Nachrichten: $queued\n";
    curl_multi_remove_handle($multiHandle, $handle);
    curl_close($handle);
}

curl_multi_close($multiHandle);
URL: https://httpbin.org/get?id=1 — HTTP-Status: 200 Verbleibende Nachrichten: 2 URL: https://httpbin.org/get?id=2 — HTTP-Status: 200 Verbleibende Nachrichten: 1 URL: https://httpbin.org/get?id=3 — HTTP-Status: 200 Verbleibende Nachrichten: 0

Fehlerbehandlung mit curl_multi_info_read

<?php
$multiHandle = curl_multi_init();

$ch1 = curl_init('https://httpbin.org/status/200');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch1);

$ch2 = curl_init('https://nicht-existierende-domain-xyz.invalid/');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_TIMEOUT, 5);
curl_multi_add_handle($multiHandle, $ch2);

$running = null;
do {
    curl_multi_exec($multiHandle, $running);
    curl_multi_select($multiHandle);
} while ($running > 0);

while ($info = curl_multi_info_read($multiHandle)) {
    if ($info['result'] === CURLE_OK) {
        echo "Transfer erfolgreich abgeschlossen.\n";
    } else {
        echo "Transfer fehlgeschlagen: " . curl_strerror($info['result']) . "\n";
    }
    curl_multi_remove_handle($multiHandle, $info['handle']);
    curl_close($info['handle']);
}

curl_multi_close($multiHandle);
Transfer erfolgreich abgeschlossen. Transfer fehlgeschlagen: Could not resolve host

// Wichtig · Fallstricke

Reihenfolge der Nachrichten: Die Reihenfolge, in der curl_multi_info_read() Ergebnisse zurückgibt, entspricht der Reihenfolge, in der die Transfers abgeschlossen wurden — nicht der Reihenfolge, in der sie gestartet wurden.

Nur einmal lesbar: Jede Nachricht kann nur einmal gelesen werden. Nach dem Aufruf wird sie aus der internen Warteschlange entfernt. Es empfiehlt sich, die Ergebnisse sofort zu verarbeiten oder zwischenzuspeichern.

Handle nicht direkt schließen: Das handle im zurückgegebenen Array sollte erst nach curl_multi_remove_handle() mit curl_close() geschlossen werden, da es sonst zu undefiniertem Verhalten kommen kann.