Heim  >  Artikel  >  Backend-Entwicklung  >  Eine Erklärung der Anwendung von curl_multi-bezogenen Funktionen in PHP

Eine Erklärung der Anwendung von curl_multi-bezogenen Funktionen in PHP

巴扎黑
巴扎黑Original
2017-05-25 17:45:341287Durchsuche

Ich glaube, dass viele Leute Probleme mit der Familie von Funktionen haben, die im PHP-Handbuch unklar sind, und die Beispiele sind so einfach, dass man daraus nichts lernen kann, aber ich habe auch viele Webseiten durchsucht Ich habe kein vollständiges Beispiel gefunden.

curl_multi_add_handle

curl_multi_close

curl_multi_exec

curl_multi_getcontent

curl_multi_info_read

curl_ multi_init

curl_multi_remove_handle

curl_multi_select

Im Allgemeinen sollte der Zweck bei der Verwendung dieser Funktionen offensichtlich darin bestehen, mehrere URLs gleichzeitig anzufordern, anstatt sie einzeln anzufordern Eins, sonst ist es nicht so gut wie Sie selbst. Schleife zum Anpassen von curl_exec.

Die Schritte sind wie folgt zusammengefasst:

Schritt 1: Curl_multi_init aufrufen
Schritt 2: Curl_multi_add_handle in einer Schleife aufrufen
In diesem Schritt ist zu beachten, dass der zweite Parameter von curl_multi_add_handle wird durch Subhandle von curl_init gegeben.
Schritt 3: Rufen Sie weiterhin „curl_multi_exec“ auf.
Schritt 4: Rufen Sie „curl_multi_getcontent“ in einer Schleife auf, um die Ergebnisse nach Bedarf zu erhalten. „Schritt 5: Rufen Sie „curl_multi_remove_handle“ und „curl_close“ für jedes Worthandle auf curl_multi_close

Hier ist ein einfaches Beispiel, das online gefunden wurde. Der Autor nennt es ein schmutziges Beispiel (ich werde später erklären, warum es schmutzig ist):

Der gesamte Verwendungsprozess ist fast so Dieser einfache Code weist jedoch eine schwerwiegende Schwäche auf: Der Abschnitt der Do-Schleife ist während der gesamten URL-Anfrage eine Endlosschleife, was leicht dazu führen kann, dass die CPU 100 % auslastet.
/*
Here's a quick and dirty example for curl-multi from PHP, tested on PHP 5.0.0RC1 CLI / FreeBSD 5.2.1
*/
$connomains = array(
"http://www.cnn.com/",
"http://www.canada.com/",
"http://www.yahoo.com/"
);
$mh = curl_multi_init();
foreach ($connomains as $i => $url) {
     $conn[$i]=curl_init($url);
      curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);
      curl_multi_add_handle ($mh,$conn[$i]);
}
do { $n=curl_multi_exec($mh,$active); } while ($active);
foreach ($connomains as $i => $url) {
      $res[$i]=curl_multi_getcontent($conn[$i]);
      curl_close($conn[$i]);
}
print_r($res);

Jetzt müssen wir eine Funktion „curl_multi_select“ verwenden, für die es fast keine Dokumentation gibt. Obwohl die Curl-Bibliothek von C über Anweisungen für „select“ verfügt, unterscheiden sich die Schnittstelle und die Verwendung in PHP tatsächlich von denen in C.

Ändern Sie den Do-Abschnitt oben wie folgt:

Da $active warten muss, bis alle URL-Daten empfangen wurden, bevor sie falsch werden, wird die Rückgabewertbeurteilung von curl_multi_exec verwendet Wenn noch Daten vorhanden sind, wird curl_multi_exec kontinuierlich aufgerufen. Wenn vorerst keine Daten vorhanden sind, tritt es in die Auswahlphase ein. Sobald neue Daten eingehen, kann es zur Fortsetzung der Ausführung aktiviert werden. Der Vorteil hierbei ist, dass kein unnötiger CPU-Verbrauch entsteht.
 do {
                        $mrc = curl_multi_exec($mh,$active);
                } while ($mrc == CURLM_CALL_MULTI_PERFORM);
                while ($active and $mrc == CURLM_OK) {
                        if (curl_multi_select($mh) != -1) {
                                do {
                                        $mrc = curl_multi_exec($mh, $active);
                                } while ($mrc == CURLM_CALL_MULTI_PERFORM);
                        }
                }

Außerdem: Es gibt einige Details, auf die Sie manchmal stoßen können:

Kontrollieren Sie das Timeout jeder Anfrage, tun Sie dies über curl_setopt vor curl_multi_add_handle:

curl_setopt($ch , CURLOPT_TIMEOUT, $ timeout);


Um festzustellen, ob eine Zeitüberschreitung oder andere Fehler aufgetreten sind, verwenden Sie: curl_error($conn[$i])

vor curl_multi_getcontent

Das obige ist der detaillierte Inhalt vonEine Erklärung der Anwendung von curl_multi-bezogenen Funktionen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn