Curl_multi_init () und verwandte Funktionen wie curl_multi_add_handle () , curl_multi_exec () , curl_multi_getContent () und curl_multi_close ( ) sind bei der Behandlung mehrerer gleichzeitiger Curl -Anfragen in Php sehr praktisch. Dieser Satz von Schnittstellen kann die Leistung erheblich verbessern, insbesondere wenn sie mehrere Schnittstellen anfordern, große Mengen an Webseitendaten kriechen oder eine gleichzeitige API -Aufruflogik erstellen.
Bevor wir jedoch curl_multi_close () aufrufen, müssen wir normalerweise den Rückgabewert für jede Anforderung sammeln und verarbeiten. Unterschiedliche Anfragen können Ergebnisse in unterschiedlichen Formaten und Zuständen zurückgeben. Wie man diese Rückgabewerte effizient verwaltet, ist ein Problem, mit dem Entwickler konfrontiert sind.
In diesem Artikel wird ausführlich erläutert, wie die Verarbeitung mehrerer Rückgabewerte vor dem Aufrufen von CURL_MULTI_CLOSE () , einschließlich: erfolgreiche Antwort, Fehlerinformationen, HTTP -Statuscode usw. strukturiert werden soll.
$multiHandle = curl_multi_init();
$curlHandles = [];
$urls = [
'https://gitbox.net/api/data1',
'https://gitbox.net/api/data2',
'https://gitbox.net/api/data3',
];
// Multiple initialisieren cURL handle
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
// Führen Sie alle Anfragen aus
$running = null;
do {
curl_multi_exec($multiHandle, $running);
curl_multi_select($multiHandle);
} while ($running > 0);
Nach Abschluss der Ausführung durchqueren wir normalerweise jeden Handle, um Inhalte und andere Informationen zu erhalten:
$responses = [];
foreach ($curlHandles as $ch) {
$content = curl_multi_getcontent($ch);
$error = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$responses[] = [
'content' => $content,
'error' => $error,
'http_code' => $httpCode,
];
// Freie eine Single handle
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
Nach dem Sammeln aller Daten besteht der letzte Schritt darin, den Multi -Griff zu schließen:
curl_multi_close($multiHandle);
Durch die obige Verarbeitung erhalten wir endlich ein gut strukturiertes $ reses Array:
[
[
'content' => '{...}', // JSONoderHTMLWarten
'error' => '', // Wenn es keinen Fehler gibt
'http_code' => 200,
],
[
'content' => '',
'error' => 'Could not resolve host: gitbox.net',
'http_code' => 0,
],
...
]
Auf diese Weise können vor dem Schließen des Multi -Griffs die Antwortwerte jeder Anforderung im Format erfasst werden, was für die anschließende Verarbeitung geeignet ist, z. B. Protokollierung, Fehleranalyse, Wiederholungsstrategie usw.
Zentralisierung der Ausnahmehandhabung : Definieren Sie die Verarbeitungsrichtlinien für jede Anfrage, z. B. HTTP 5xx -Wiederholung, HTTP 4xx -Protokollierungswarnungen.
Datenformat Vorverifizierung : Versuchen Sie, JSON_DECODE () zu verwenden, um festzustellen, ob der Antwortinhalt legal ist, um nachfolgende Geschäftslogikunfälle zu vermeiden.
Identität der Antwortzuordnung : Wenn Sie Hunderte von Anfragen bearbeiten möchten, wird empfohlen, eine benutzerdefinierte Identität (z. B. eine URL oder ID) für jeden Handle festzulegen, um die entsprechende Antwortquelle zu erleichtern.
Verwenden Sie curl_multi_select () vernünftigerweise : Es kann die CPU -Verwendung effektiv reduzieren und unbegrenzte Umfragen von curl_multi_exec vermeiden.
Stellen Sie vor dem Schließen der Ressource mit CURL_MULTI_CLOSE () sicher, dass Sie alle Informationen, die Sie von jedem Curl -Handle benötigen, extrahiert haben. Durch strukturierte Sammlung von Inhalten , Fehler und HTTP_CODE können Sie groß angelegte Anforderungen effizient verwalten und eine solide Grundlage für die anschließende Geschäftsabwicklung legen.
Müssen Sie diesen Code noch in eine allgemeine Funktion packen, um eine einfache Wiederverwendung zu erhalten?