Mit verschiedenen Versionen von Curl wird die Testversion in PHP unterschiedlich. Es gibt zwar immer noch Verwirrung über die Verwendung von Curl im Internet, aber es gibt keine Erklärung. Ich werde die Informationen, die ich gefunden habe, mit Ihnen teilen
Zunächst einige Funktionen
curlm_multi_init
Diese Funktion gibt ein CURLM-Handle zurück, das als Eingabe für alle anderen Multifunktionsfunktionen verwendet wird und an einigen Stellen in der Dokumentation manchmal als Multi-Handle bezeichnet wird
MUSS einen entsprechenden Aufruf von curl_multi_cleanup haben, wenn
Der Vorgang ist abgeschlossen.
Diese Funktion gibt ein CURLM-Handle zurück, das als Eingabe für alle anderen Multifunktionsfunktionen verwendet wird, d. h. als Parameter übergeben wird, dieser Initialisierungsaufruf muss einen entsprechenden Funktionsaufruf curl_multi_cleanup haben, wenn der Vorgang abgeschlossen ist
curl_multi_exec
Diese Funktion ruft tatsächlich die zugrunde liegende Funktion „curl_multi_perform“ auf. Schauen wir uns die einfachste Beschreibung im Dokument an.
Es ist so:
liest/schreibt verfügbare Daten von jedem einfachen Handle
Ins Chinesische übersetzt: liest oder schreibt von jedem Handle. Verfügbare Daten
Es gibt einen Absatz unten
Diese Funktion verarbeitet Übertragungen auf allen hinzugefügten Handles, die Aufmerksamkeit erfordern, auf nicht blockierende Weise.
Wenn eine Anwendung herausgefunden hat, dass Daten für verfügbar sind Wenn das multi_handle oder eine Zeitüberschreitung abgelaufen ist, sollte die Anwendung diese Funktion aufrufen, um alles zu lesen/schreiben, was gerade zu lesen oder zu schreiben ist usw. curl_multi_perform gibt zurück Sobald die Lese-/Schreibvorgänge abgeschlossen sind, erfordert, dass tatsächlich Daten zum Lesen verfügbar sind oder dass Daten geschrieben werden können, kann sie nur für den Fall aufgerufen werden. Sie schreibt die Nummer von Handles, die im zweiten noch Daten übertragen Ganzzahlzeiger des Arguments.
Wenn sich die Anzahl der running_handles gegenüber dem vorherigen Aufruf geändert hat (oder geringer ist als die Anzahl der einfachen Handles, die Sie dem Multi-Handle hinzugefügt haben), wissen Sie Bescheid dass es eine oder mehrere Überweisungen gibt less „running“. Anschließend können Sie „curl_multi_info_read“ aufrufen, um Informationen über jede abgeschlossene Person zu erhalten übertragen, und die zurückgegebenen Informationen includes CURLcode und mehr. Wenn ein hinzugefügtes Handle sehr schnell fehlschlägt, wird es möglicherweise nie als Running_Handle gezählt.
Wenn Running_handles ist Bei der Rückkehr dieser Funktion auf Null (0) gesetzt, sind keine Übertragungen mehr im Gange.
Sehen wir uns an, was diese Passage sagt:
Diese Funktion verarbeitet alle Datentransfers auf der Handle hinzugefügt: Wenn ein referenzierendes Programm zu verarbeitende Daten findet oder eine Zeitüberschreitung auftritt, sollte die Funktion zurückkehren, wenn der Lese- oder Schreibvorgang abgeschlossen ist. Es sind keine zu lesenden Daten vorhanden geschrieben und kann in jedem Fall aufgerufen werden. Nach dem Aufruf dieser Funktion wird der zweite an sie übergebene Parameter (running -handles) festgelegt, der angibt, wie viele weitere aktive Verbindungen vorhanden sind.
Wenn running-handles aufgerufen wird Aus dem vorherigen Aufruf geht hervor, dass die Übertragung abgeschlossen ist oder ein Übertragungsfehler aufgetreten ist. Um den Übertragungsstatus jeder Verbindung anzuzeigen, müssen Sie die Funktion „curl-multi -read-info“ aufrufen. Sie gibt ein Array zurück enthält drei Daten. Weitere Informationen finden Sie im PHP-Hilfedokument.
Wenn run-handles von Curl auf 0 gesetzt wird, bedeutet dies, dass alle Übertragungen abgeschlossen sind.
Sie sind möglicherweise verwirrt über den Rückgabewert, oder? ?
CURLMcode-Typ, allgemeiner libcurl-Multi-Interface-Fehlercode.
Vor Version 7.20.0: Wenn Sie CURLM_CALL_MULTI_PERFORM erhalten, Dies bedeutet im Grunde, dass Sie „curl_multi_perform“ erneut aufrufen sollten, bevor Sie „select()“ für weitere Aktionen ausführen. Sie müssen dies nicht sofort tun, aber der Rückkehrcode bedeutet, dass libcurl möglicherweise mehr Daten zum Zurückgeben zur Verfügung hat oder dass mehr Daten gesendet werden müssen, bevor es „erfüllt“ ist. Beachten Sie, dass „curl_multi_perform“ dies tut Nur CURLM_CALL_MULTI_PERFORM zurückgeben wenn es sofort erneut aufgerufen werden soll. Wenn alles in Ordnung ist und nichts Sofortiges erledigt werden soll, wird CURLM_OK zurückgegeben Sie müssen auf „Aktion“ warten und diese Funktion dann erneut aufrufen.
Diese Funktion gibt nur Fehler usw. zurück, die den gesamten Multi-Stack betreffen. Es können auch dann noch Probleme bei einzelnen Übertragungen aufgetreten sein, wenn diese Funktion CURLM_OK zurückgibt . Verwenden Sie curl_multi_info_read, um herauszufinden, wie einzelne Überweisungen funktionierten.
Wenn Sie vor Version 7.20.0 CURLM_CALL_MULTI_PERFORM erhalten, bedeutet dies, dass Sie die Funktion „curl_multi_perform“ erneut aufrufen sollten. Wenn keine Daten zur Verarbeitung vorhanden sind, wird vor dem Aufruf von „curl_multi_select“ CURLM_OK zurückgegeben, und Sie müssen nur auf die Funktion warten Aktion. (Lassen Sie uns vorerst Aktion als Aktion verstehen, da ich wirklich kein besseres Wort finden kann.) Wenn CURLM_OK zurückgegeben wird, müssen Sie nur warten, bis (Hinweis), hier ist der Curl_multi_select, den wir aufgerufen haben, nur er gibt den Wert -1 zurück, egal was passiert, er wird nicht auf eine Aktion warten, aber nach der USleep-Periode wird immer noch curl-multi-perform aufgerufen, was möglicherweise keinen Sinn ergibt, aber es gibt keine Möglichkeitcurl_multi_select
Lass uns zuerst über die Funktion dieser Funktion sprechen
Für den folgenden Code
while($still_running && $result== CURLM_OK)
{
tun
{
$result=curl_multi_exec($mh,$ still_running) ;
}while($result==CURLM_CALL_MULTI_PERFORM);
}
Wenn Sie curl_multi_select in diesem Code nicht verwenden, können Sie Sie werden feststellen, dass die CPU ungeheuerlich ist. Dies wirkt sich auf die Effizienz Ihrer CPU-Auslastung aus, da dieser bedeutungslose Code (für einen bestimmten Zeitraum) weiterhin aufgerufen wird.
Diese Funktion befindet sich in PHP Im Hilfedokument wird erklärt, dass
blockiert, bis eine aktive Verbindung in der cURL-Batch-Verbindung besteht
Mit anderen Worten: Wenn keine Datenübertragung erkannt wird, wird es blockiert, aber Sie müssen Achtung Ja, der folgende Code ist in der aktuellen Version nicht anwendbar,
while($still_running && $result==CURLM_OK)
{
if(curl_multi_select($mh)!=-1)
{
do
{
$result=curl_multi_exec($mh,$still_running);
}while($result==CURLM_CALL_MULTI_PERFORM);
}
}
Es ist wirklich bedauerlich, dass dieser Code in eine tote Schleife fällt Wenn Sie den Grund dafür herausfinden, werden Sie feststellen, dass curl_multi_select nur -1 zurückgibt, was bedeutet, dass der darin enthaltene Inhalt nie vorhanden ist aufgerufen wurde. Was zu tun ist, es werden zumindest keine Fehler auftreten, wenn Sie diesen Code sehen
while($still_running && $result==CURLM_OK)
{
if(curl_multi_select($mh)==-1)
{
usleep(100);//Dies muss von Ihnen selbst geschrieben werden , Sie können es selbst entscheiden, die offizielle Empfehlung ist 100ms
}
tun
{
$result=curl_multi_exec($mh, $still_running ;
curl_multi_info_readDiese Funktion ist im PHP-Hilfedokument sehr klar angegeben Abfrage, ob sich das Batch-Handle in einem befindet separater Übertragungsthread Es werden Neuigkeiten oder Informationen zurückgegeben. Nachrichten können Fehlercodes enthalten, wie sie beispielsweise von einzelnen Übertragungsthreads zurückgegeben werden, oder einfach Berichte darüber, ob der Übertragungsthread abgeschlossen wurde. Gibt bei Erfolg eine Reihe verwandter Informationen zurück und gibt
bei Fehler zurück.
Laut meinem Test gibt es bei einer Meldung nur zwei mögliche Situationen:
1. Die Übertragung wurde abgeschlossen FALSE
2. Übertragungsfehler
curl_multi_getcontent($res)
Diese Funktion ist viel einfacher
Wenn festgelegt
, dann den erhaltenen Ausgabetextstrom zurückgebenBeachten Sie, dass der $res-Parameter ein bestimmtes Curl-Handle ist
CURLOPT_RETURNTRANSFER
Das Folgende ist a URL für alle empfohlen. :
Hier erfahren Sie, wie Sie die Parameter von curl_setopt einstellen. Darin liegt schließlich das ganze Geheimnis von Curl
Das Obige stellt die Verwendung von Curl in PHP vor, einschließlich seiner Aspekte. Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.