Bei Verwendung der Funktionserie von CURL_MULTI_* , um gleichzeitige Anforderungen zu erstellen, öffnen wir normalerweise mehrere Curl -Handles und fügen sie einem Curl_Multi -Handle für einheitliches Management hinzu.
Um sicherzustellen, dass alle Anfragen korrekt abgeschlossen wurden, bevor CURL_MULTI_CLOSE zur Freigabe von Ressourcen aufgerufen wird, müssen wir den Ausführungsstatus jeder Anfrage vernünftigerweise erkennen. Dieser Artikel erläutert eine Standard- und zuverlässige Möglichkeit, diese Anforderung zu erreichen.
Normalerweise befolgen wir die folgenden Schritte, um mehrere Anfragen zu bearbeiten:
Initialisieren Sie mehrere lockere getrennte Griffe.
Fügen Sie diese Griffe einem Curl_Multi -Handle hinzu.
Führen Sie die Anforderungen kontinuierlich mit curl_multi_exec aus.
Verwenden Sie curl_multi_select , um mit curl_multi_exec zusammenzuarbeiten, um festzustellen, ob eine Anforderung abgeschlossen wurde.
Entfernt die abgeschlossene Anfrage bearbeitet einzeln.
Stellen Sie sicher, dass alle Anfragen abgeschlossen sind, und rufen Sie dann curl_multi_close auf.
Hier ist ein vollständiges Beispiel: Angenommen, wir müssen mehrere URLs anfordern (hier nehmen wir https://gitbox.net/example1 und https://gitbox.net/example2 als Beispiele):
<?php
// Initialisierung cURL multi Handhaben
$multiHandle = curl_multi_init();
// Lagern Sie jeweils cURL Handhaben的数组
$curlHandles = [];
// Anfordern URL Liste
$urls = [
'https://gitbox.net/example1',
'https://gitbox.net/example2',
];
// Erstellen und fügen Sie jeden hinzu und fügen Sie sie hinzu cURL Handhaben
foreach ($urls as $i => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$i] = $ch;
}
// implementieren multi fragen
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
// verhindern CPU Leerlauf
if ($status == CURLM_OK) {
curl_multi_select($multiHandle);
} else {
break;
}
// 检查是否有已完成的fragen
while ($info = curl_multi_info_read($multiHandle)) {
if ($info['msg'] == CURLMSG_DONE) {
// 获取完成的Handhaben
$completedHandle = $info['handle'];
// Holen Sie sich den zurückgegebenen Inhalt
$response = curl_multi_getcontent($completedHandle);
// Die zurückgegebenen Daten können hier verarbeitet werden
echo "fragen完成,Datenlänge zurückgeben:" . strlen($response) . PHP_EOL;
// 移除并关闭已完成的Handhaben
curl_multi_remove_handle($multiHandle, $completedHandle);
curl_close($completedHandle);
}
}
} while ($running > 0);
// Letzter Schließung multi Handhaben
curl_multi_close($multiHandle);
CURL_MULTI_EXEC : Fördern Sie die Ausführung gleichzeitiger Anforderungen und senden Sie die Anzahl der noch ausgeführten Verbindungen zurück.
curl_multi_select : Wird verwendet, um aktive Verbindungen zu blockieren und zu warten, um die Verschwendung von CPU -Ressourcen zu verringern.
CURL_MULTI_INFO_READ : Erkennt, ob eine Anforderung abgeschlossen wurde und die abgeschlossenen Handles gleichzeitig verarbeiten kann.
curl_multi_close wird nur aufgerufen, wenn $ running == 0 und alle Klongriffe entfernt und geschlossen wurden.
Wenn es viele Anfragen gibt, wird empfohlen, einen Zeitüberschreitungsmechanismus hinzuzufügen, um zu verhindern, dass einige Anfragen lange stecken bleiben.
curl_multi_select gibt manchmal -1 zurück, in diesem Fall müssen Sie usleep () für kleine Warten verwenden, um eine tote Schleife zu verhindern.
if (curl_multi_select($multiHandle) == -1) {
usleep(100);
}
Dies stellt sicher, dass das Skript robuster ist.
Bevor Sie curl_multi_close verwenden, besteht der Schlüssel darin zu bestätigen, dass alle Unterrequests ordnungsgemäß abgeschlossen und gereinigt wurden. Das obige Muster ist eine übliche und empfohlene Standardpraxis.
Das Verhalten des Verhaltens der Serie curl_multi_* hilft dabei, effizientere und stabilere und gleichzeitige Netzwerkanforderungscode zu schreiben!