Wenn Sie die Funktion curl_multi in PHP verwenden, können Sie auf eine gemeinsame Situation stoßen: Während des Prozesses der parallelen Multi-Request-Verarbeitung kann Curl_Multi_Close () die derzeit laufende Anfrage unterbrechen. Dieses Problem veranlasst manchmal, dass das Programm nicht alle gleichzeitigen Anfragen reibungslos abgeschlossen hat. Daher sind geeignete Maßnahmen erforderlich, um dieses Problem zu vermeiden. In diesem Artikel werden während des Anforderungsprozesses effektiv mit dem Problem der Unterbrechung von CURL_MULTI_CLOSE umgehen.
curl_multi_close () ist eine Funktion, die durch die Curl -Erweiterung von PHP bereitgestellt wird, um Curl -mehrere Handles zu schließen, die von curl_multi_init () erstellt wurden. Seine Funktion besteht darin, die Ressource freizugeben. Wenn die Funktion jedoch während des Anforderungsprozesses im Voraus aufgerufen wird, ist es möglich, die unvollendete Anfrage zu unterbrechen. Dies kann zu Datenverlust oder unvollständigen Anfragen führen, die die Stabilität und Leistung des Systems beeinflussen.
Hier ist ein einfaches Beispiel curl_multi -Anforderungsbeispiel:
<?php
// Initialisierung curl_multi Handhaben
$mh = curl_multi_init();
// Multiple erstellen cURL Handhaben
$ch1 = curl_init("http://gitbox.net/api/data1");
$ch2 = curl_init("http://gitbox.net/api/data2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// Legen Sie jeweils ein cURL Handhaben添加到 multi Handhaben中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// Führen Sie alle Anfragen aus
$running = null;
do {
$mrc = curl_multi_exec($mh, $running);
} while ($running > 0);
// Holen Sie sich die zurückgegebenen Daten
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// Schließung cURL Handhaben
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// Schließung multi Handhaben
curl_multi_close($mh);
?>
In diesem Beispiel fügen wir dem mehrfachen Handle $ MH über curl_multi_add_handle () mehrere Curl -Handle hinzu und führen alle Anforderungen parallel über curl_multi_exec () aus. Schließlich schließen wir den Multi-Griff über curl_multi_remove_handle () und curl_multi_close () .
Das Problem tritt auf, wenn CURL_MULTI_CLOSE () aufgerufen wird, was mehrere Griffe im Voraus schließen kann, was dazu führt, dass die Anfrage in der Mitte unterbrochen wird. Wenn ein Interrupt auftritt, wenn nicht alle Anforderungen abgeschlossen wurden, kann die unvollendete Anfrage keine Antwortdaten oder Rückgabergebnisse erhalten.
Um sicherzustellen, dass curl_multi_close () die Anforderung nicht unterbricht, können die folgenden Methoden verwendet werden:
Die häufigste Lösung besteht darin, sicherzustellen, dass alle Anfragen abgeschlossen wurden und dann curl_multi_close () aufrufen. Sie können den Rückgabewert von curl_multi_exec () verwenden, um festzustellen, ob alle Anforderungen abgeschlossen sind. Wenn der Wert der laufenden Variablen 0 beträgt, bedeutet dies, dass alle Anforderungen abgeschlossen wurden. Nur dann wird curl_multi_close () aufgerufen.
Der geänderte Code lautet wie folgt:
<?php
// Initialisierung curl_multi Handhaben
$mh = curl_multi_init();
// Multiple erstellen cURL Handhaben
$ch1 = curl_init("http://gitbox.net/api/data1");
$ch2 = curl_init("http://gitbox.net/api/data2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// Legen Sie jeweils ein cURL Handhaben添加到 multi Handhaben中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// Führen Sie alle Anfragen aus
$running = null;
do {
$mrc = curl_multi_exec($mh, $running);
// Eine kleine Verzögerung kann hier hinzugefügt werden, um langsamer zu werden CPU Nutzungsrate
usleep(100);
} while ($running > 0);
// Holen Sie sich die zurückgegebenen Daten
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// Schließung cURL Handhaben
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// Schließung multi Handhaben
curl_multi_close($mh);
?>
Die Anfrage wird kontinuierlich über eine Do-While -Schleife ausgeführt, bis zum Laufen 0 ist. Zu welchem Zeitpunkt wurden alle Anforderungen abgeschlossen, und curl_multi_close () kann sicher aufgerufen werden.
Manchmal, selbst wenn alle Anfragen abgeschlossen zu sein scheinen, können sie aufgrund von Problemen wie Netzwerkfehlern unterbrochen werden. Zu diesem Zeitpunkt können Sie nachdenken, wenn die Anfrage fehlschlägt.
<?php
// Stellen Sie die maximale Anzahl von Wiederholungszeiten ein
$maxRetries = 3;
function performRequest($ch, $maxRetries) {
$retryCount = 0;
$response = null;
while ($retryCount < $maxRetries) {
$response = curl_exec($ch);
if ($response !== false) {
break;
}
$retryCount++;
usleep(500000); // Warten Sie eine Weile, bevor Sie es erneut versuchen
}
return $response;
}
// Initialisierung curl_multi Handhaben
$mh = curl_multi_init();
// Multiple erstellen cURL Handhaben
$ch1 = curl_init("http://gitbox.net/api/data1");
$ch2 = curl_init("http://gitbox.net/api/data2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// Legen Sie jeweils ein cURL Handhaben添加到 multi Handhaben中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// Führen Sie alle Anfragen aus
$running = null;
do {
$mrc = curl_multi_exec($mh, $running);
} while ($running > 0);
// Holen Sie sich die zurückgegebenen Daten,Versuchen Sie es erneut
$response1 = performRequest($ch1, $maxRetries);
$response2 = performRequest($ch2, $maxRetries);
// Schließung cURL Handhaben
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// Schließung multi Handhaben
curl_multi_close($mh);
?>
Im obigen Code versucht die Funktion "PerformRequest ()) , wenn die Anforderung fehlschlägt, bis die maximale Anzahl von Wiederholungen erreicht ist. Dies kann aufgrund von Netzwerkproblemen effektiv Anforderungsunterbrechungen vermeiden.
curl_multi_select () kann PHP -Programmen helfen, mehrere Anforderungen effizienter zu bearbeiten und in jeder Schleife zu vermeiden, Curl_Multi_exec () aufzurufen. Es wird die Anfrage weiter ausführen, wenn bestimmte Bedingungen erfüllt sind, wodurch Systemressourcen speichern können.
<?php
// Initialisierung curl_multi Handhaben
$mh = curl_multi_init();
// Multiple erstellen cURL Handhaben
$ch1 = curl_init("http://gitbox.net/api/data1");
$ch2 = curl_init("http://gitbox.net/api/data2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// Legen Sie jeweils ein cURL Handhaben添加到 multi Handhaben中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// Führen Sie alle Anfragen aus
$running = null;
do {
curl_multi_select($mh);
$mrc = curl_multi_exec($mh, $running);
} while ($running > 0);
// Holen Sie sich die zurückgegebenen Daten
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// Schließung cURL Handhaben
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// Schließung multi Handhaben
curl_multi_close($mh);
?>
curl_multi_select () kann warten, wenn keine verfügbaren Daten vorhanden sind, wodurch unnötige CPU -Verwendung vermieden wird. Es ist eine effizientere Art und Weise, insbesondere wenn es viele Anfragen gibt.