In PHP bieten die Funktionserie von curl_multi_* die Möglichkeit, mehrere Curl -Anforderungen asynchron zu verarbeiten, was für Szenarien nützlich ist, in denen mehrere URLs gleichzeitig angefordert werden und auf die Ergebnisse warten. In diesen asynchronen Anforderungen wird Curl_getInfo verwendet, um detaillierte Informationen zu jeder Anforderung zu erhalten, z.
In diesem Artikel wird erläutert, wie die detaillierten Informationen der Anforderung durch curl_getInfo korrekt erhalten werden, wenn mehrere Anforderungen mithilfe von curl_multi_close verarbeitet werden und Probleme mit der Datensynchronisation vermeiden, die durch einen unsachgemäßen Abschluss des Abschlusses von Anforderungen verursacht werden.
In PHP können wir mit der Funktion curl_multi_* mehrere Curl -Anforderungen gleichzeitig einleiten und parallel über mehrere Threads verarbeiten. Verwenden Sie beispielsweise curl_multi_init , um einen Curl -Handle -Set zu initialisieren, verwenden Sie curl_multi_add_handle , um mehrere Curl -Handles hinzuzufügen, dann über curl_multi_exec ausführen und warten Sie, bis alle Anforderungen abgeschlossen sind. Schließlich schließen Sie die Sitzung mit curl_multi_close .
Hier ist ein einfaches Beispiel:
$mh = curl_multi_init(); // Initialisierung multi curl Handhaben
$ch1 = curl_init("http://gitbox.net/api/data1"); // fragen 1
$ch2 = curl_init("http://gitbox.net/api/data2"); // fragen 2
curl_multi_add_handle($mh, $ch1); // 添加fragen 1
curl_multi_add_handle($mh, $ch2); // 添加fragen 2
do {
$mrc = curl_multi_exec($mh, $active);
} while ($active && $mrc == CURLM_OK);
curl_multi_remove_handle($mh, $ch1); // 移除fragen 1
curl_multi_remove_handle($mh, $ch2); // 移除fragen 2
curl_multi_close($mh); // Schließung multi curl Handhaben
Wenn mehrere Anfragen gleichzeitig ausgeführt werden, möchten wir normalerweise in der Lage sein, ihre Details zu erhalten, nachdem alle Anfragen abgeschlossen sind. Die Funktion curl_getInfo wird verwendet, um Ausführungsinformationen für jede Curl -Anforderung zu erhalten, z. B. den zurückgegebenen Statuscode ( Curlinfo_Http_code ) und andere Metadaten. Da jedoch mehrere Anfragen asynchron und parallel gestellt werden, muss curl_getInfo zum richtigen Zeitpunkt aufgerufen werden, um sicherzustellen, dass die Daten nicht abgerufen werden, bevor die Anforderung vollständig ausgeführt wurde.
Wenn Sie Curl_getInfo aufrufen, bevor die Anforderung abgeschlossen ist, können Sie falsch oder unvollständige Daten erhalten. Daher ist ein vernünftiger Zeitpunkt der Synchronisation sehr wichtig.
Wenn Sie curl_multi_exec anrufen, um mehrere Anforderungen auszuführen, greift PHP eine Schleife ein, bis alle Anforderungen ausgeführt werden. In diesem Prozess kann curl_multi_select uns auch helfen, das Ereignis zu warten, sodass wir besser steuern können, wann das Ergebnis der Anfrage erzielt werden sollen.
do {
// 等待fragen完成
$mrc = curl_multi_exec($mh, $active);
// Warten Sie, bis die Daten fertig sind
if ($active) {
curl_multi_select($mh);
}
} while ($active && $mrc == CURLM_OK);
Sobald alle Anfragen abgeschlossen sind und alle Griffe entfernt werden, ist es der richtige Zeitpunkt, um die Anforderungsinformationen zu erhalten. Wenn Sie den Griff im Voraus schließen, können Sie das Ergebnis einiger Anfragen möglicherweise verpassen.
// 获取fragen信息
$info1 = curl_getinfo($ch1);
$info2 = curl_getinfo($ch2);
// Ausgabeinformationen
echo "Request 1 HTTP Code: " . $info1['http_code'] . "\n";
echo "Request 2 HTTP Code: " . $info2['http_code'] . "\n";
Denken Sie nach dem Erhalten der Daten daran, jeden Griff aus der Sitzung curl_multi zu entfernen und am Ende zu schließen. Dies stellt sicher, dass keine Versuche mehr unternommen werden, die Ergebnisse der geschlossenen Anfrage zu erhalten.
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
In Kombination mit dem oben genannten finden Sie hier ein vollständigeres Beispiel, das zeigt, wie die Details jeder Anfrage korrekt abgerufen werden und sicherstellen, dass keine Datensynchronisationsprobleme vorliegen:
$mh = curl_multi_init(); // Initialisierung multi curl Handhaben
$ch1 = curl_init("http://gitbox.net/api/data1"); // fragen 1
$ch2 = curl_init("http://gitbox.net/api/data2"); // fragen 2
curl_multi_add_handle($mh, $ch1); // 添加fragen 1
curl_multi_add_handle($mh, $ch2); // 添加fragen 2
// 执行fragen并等待完成
do {
$mrc = curl_multi_exec($mh, $active);
if ($active) {
curl_multi_select($mh); // Warten Sie, bis die Daten fertig sind
}
} while ($active && $mrc == CURLM_OK);
// 获取fragen的执行信息
$info1 = curl_getinfo($ch1);
$info2 = curl_getinfo($ch2);
// 输出fragen信息
echo "Request 1 HTTP Code: " . $info1['http_code'] . "\n";
echo "Request 2 HTTP Code: " . $info2['http_code'] . "\n";
// 移除Handhaben
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// Schließung multi curl Handhaben
curl_multi_close($mh);
Durch die korrekte Verwendung von curl_multi_exec und curl_multi_select und der Sicherstellung, dass Informationen über Curl_getInfo nach Abschluss der Anforderung erhalten werden, können Datensynchronisationsprobleme, die durch asynchrone Anforderungen verursacht werden, effektiv vermieden werden. Für die Verarbeitung gleichzeitiger Anfragen ist das Timing von entscheidender Bedeutung. Eine angemessene Anrufbefehls- und Synchronisationsstrategie kann sicherstellen, dass die richtigen Daten erhalten werden.