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