Signatur
Beschreibung
curl_multi_errno() liefert den internen Fehlercode, der nach einer fehlgeschlagenen Operation auf einem cURL-Multihandle gesetzt wurde. Der Rückgabewert ist eine der CURLM_*-Konstanten (z. B. CURLM_BAD_HANDLE, CURLM_CALL_MULTI_PERFORM etc.) oder CURLM_OK (0), wenn kein Fehler vorliegt.
Die Funktion ist das Multi-Handle-Pendant zu curl_errno() für einzelne Handles. Sie ergänzt curl_multi_strerror(), mit der sich die zugehörige menschenlesbare Fehlermeldung abfragen lässt. Üblicherweise wird sie eingesetzt, nachdem curl_multi_exec() oder eine andere Multi-Handle-Funktion einen Fehler signalisiert hat.
Typischer Einsatz: Fehlerbehandlung in asynchronen HTTP-Anfragen, bei denen mehrere Verbindungen gleichzeitig über ein cURL-Multihandle verwaltet werden. Der Fehlercode kann protokolliert oder zur Steuerung von Retry-Logik verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $multi_handle Pflicht | CurlMultiHandle | Ein gültiges cURL-Multihandle, das zuvor mit curl_multi_init() erstellt wurde. |
Rückgabewert
CURLM_*-Fehlerkonstante zurück. 0 (CURLM_OK) bedeutet, dass kein Fehler vorliegt. Alle anderen Werte repräsentieren einen spezifischen Fehlercode der libcurl-Multihandle-Schicht.Beispiele
Fehlercode nach curl_multi_exec auswerten
<?php
$mh = curl_multi_init();
$ch1 = curl_init('https://example.com');
$ch2 = curl_init('https://example.org');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
$running = null;
do {
$status = curl_multi_exec($mh, $running);
if ($status !== CURLM_OK) {
$errno = curl_multi_errno($mh);
$errmsg = curl_multi_strerror($errno);
echo "cURL-Multi-Fehler #{$errno}: {$errmsg}" . PHP_EOL;
break;
}
if ($running) {
curl_multi_select($mh);
}
} while ($running > 0);
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);
echo 'Antwort 1: ' . strlen($response1) . ' Bytes' . PHP_EOL;
echo 'Antwort 2: ' . strlen($response2) . ' Bytes' . PHP_EOL;
Fehlercode protokollieren und Fehlertext ausgeben
<?php
$mh = curl_multi_init();
// Absichtlich ungültige URL, um einen Fehler zu provozieren
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://this-domain-does-not-exist.invalid');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_multi_add_handle($mh, $ch);
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
$errno = curl_multi_errno($mh);
if ($errno !== CURLM_OK) {
printf(
'Multihandle-Fehler: [%d] %s' . PHP_EOL,
$errno,
curl_multi_strerror($errno)
);
} else {
// Einzelne Handle-Fehler prüfen
$info = curl_multi_info_read($mh);
if ($info && $info['result'] !== CURLE_OK) {
printf(
'Transfer-Fehler: [%d] %s' . PHP_EOL,
$info['result'],
curl_strerror($info['result'])
);
}
}
curl_multi_remove_handle($mh, $ch);
curl_multi_close($mh);
curl_close($ch);
// Wichtig · Fallstricke
Hinweis zur Fehlerunterscheidung: curl_multi_errno() meldet nur Fehler auf der Multihandle-Ebene (z. B. Initialisierungsfehler). Fehler einzelner übertragener Verbindungen werden über curl_multi_info_read() und anschließend curl_errno() bzw. curl_strerror() abgefragt.
Verfügbarkeit: Die Funktion wurde mit PHP 7.1.0 eingeführt. In älteren PHP-Versionen steht sie nicht zur Verfügung; dort liefert curl_multi_exec() den Statuscode direkt als Rückgabewert.
Konstanten: Relevante CURLM_*-Konstanten sind u. a. CURLM_OK (0), CURLM_BAD_HANDLE (1), CURLM_BAD_EASY_HANDLE (2), CURLM_OUT_OF_MEMORY (3) und CURLM_INTERNAL_ERROR (4).