Heim > Backend-Entwicklung > PHP-Tutorial > Über PHP Curl asynchrone gleichzeitige Anfrage http

Über PHP Curl asynchrone gleichzeitige Anfrage http

藏色散人
Freigeben: 2023-04-09 17:32:01
nach vorne
5620 Leute haben es durchsucht

Empfohlen: „PHP-Video-Tutorial

Werfen wir zunächst einen Blick auf den Synchronisierungscode und die Anforderungszeit.

$start_time=date("h:i:sa");
for ($i=0; $i <100 ; $i++) { 
	$urls[]="http://www.downxia.com/downinfo/2315".$i.".html";
	GetTitle(geturl("http://www.downxia.com/downinfo/2315".$i.".html"));
}
function geturl($url){
       
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        
        $output = curl_exec($ch);
        curl_close($ch);

        return $output;
}
function GetTitle($output){

	preg_match(&#39;/<title>.*<\/title>/i&#39;,$output,$matches);
	var_dump($matches[0]);
}
$end_time=date("h:i:sa");
echo &#39;开始时间是:&#39;.$start_time;
echo &#39;结束时间是:&#39;.$end_time;
Nach dem Login kopieren

Sie können unten sehen, dass es 27 Sekunden gedauert hat.

Als nächstes werfen wir einen Blick auf den Code und die Zeit, die für die asynchronen gleichzeitigen http-Anfragen von PHP Curl aufgewendet wird.

$start_time=date("h:i:sa");

$urls=[];
for ($i=0; $i <100 ; $i++) { 
	$urls[]="http://www.downxia.com/downinfo/2315".$i.".html";
}
var_dump($urls);
// GetTitle(&#39;klasjdkla<title>313asds12</title>&#39;);

rolling_curl($urls,&#39;GetTitle&#39;);

function GetTitle($output){

	preg_match(&#39;/<title>.*<\/title>/i&#39;,$output,$matches);
	var_dump($matches[0]);
}
$end_time=date("h:i:sa");

echo &#39;开始时间是:&#39;.$start_time;
echo &#39;结束时间是:&#39;.$end_time;

function rolling_curl($urls, $callback, $custom_options = null)
{//多个url访问

    // make sure the rolling window isn&#39;t greater than the # of urls
    $rolling_window = 5;
    $rolling_window = (sizeof($urls) < $rolling_window) ? sizeof($urls) : $rolling_window;

    $master   = curl_multi_init();
    $curl_arr = array();

    // add additional curl options here
    $std_options = array(
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_MAXREDIRS      => 5
        );
    $options = ($custom_options) ? ($std_options + $custom_options) : $std_options;

    // start the first batch of requests
    for ($i = 0; $i < $rolling_window; $i++) {
        $ch                   = curl_init();
        $options[CURLOPT_URL] = $urls[$i];
        curl_setopt_array($ch, $options);
        curl_multi_add_handle($master, $ch);
    }

    do {
        while (($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);
        if ($execrun != CURLM_OK) {
            break;
        }

        // a request was just completed -- find out which one
        while ($done = curl_multi_info_read($master)) {
            $info = curl_getinfo($done[&#39;handle&#39;]);
            if ($info[&#39;http_code&#39;] == 200) {
                $output = curl_multi_getcontent($done[&#39;handle&#39;]);

                // request successful.  process output using the callback function.
                $callback($output);

                // start a new request (it&#39;s important to do this before removing the old one)
                $ch                   = curl_init();
                $options[CURLOPT_URL] = $urls[$i++]; // increment i
                curl_setopt_array($ch, $options);
                curl_multi_add_handle($master, $ch);

                // remove the curl handle that just completed
                curl_multi_remove_handle($master, $done[&#39;handle&#39;]);
            } else {
                // request failed.  add error handling.
            }
        }
    } while ($running);

    curl_multi_close($master);
    return true;
}
Nach dem Login kopieren

Es hat nur 3 Sekunden gedauert? Tatsächlich glaube ich, dass es 5 Sekunden gedauert hat, da der Startvorgang langsamer ist als die Synchronisierung, und er am Anfang 2 Sekunden lang hängengeblieben ist.

http-Anfrageeffizienz, es besteht kein Zweifel, dass asynchron viel höher ist als synchron.

Der Kernanforderungscode lautet wie folgt: (Dies wurde von einem Ausländer geschrieben, es gibt ein kleines Problem, die letzte Eingabeaufforderung ist ein undefinierter Offset)

function rolling_curl($urls, $callback, $custom_options = null)
{//多个url访问

    // make sure the rolling window isn&#39;t greater than the # of urls
    $rolling_window = 5;
    $rolling_window = (sizeof($urls) < $rolling_window) ? sizeof($urls) : $rolling_window;

    $master   = curl_multi_init();
    $curl_arr = array();

    // add additional curl options here
    $std_options = array(
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_MAXREDIRS      => 5
        );
    $options = ($custom_options) ? ($std_options + $custom_options) : $std_options;

    // start the first batch of requests
    for ($i = 0; $i < $rolling_window; $i++) {
        $ch                   = curl_init();
        $options[CURLOPT_URL] = $urls[$i];
        curl_setopt_array($ch, $options);
        curl_multi_add_handle($master, $ch);
    }

    do {
        while (($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);
        if ($execrun != CURLM_OK) {
            break;
        }

        // a request was just completed -- find out which one
        while ($done = curl_multi_info_read($master)) {
            $info = curl_getinfo($done[&#39;handle&#39;]);
            if ($info[&#39;http_code&#39;] == 200) {
                $output = curl_multi_getcontent($done[&#39;handle&#39;]);

                // request successful.  process output using the callback function.
                $callback($output);

                // start a new request (it&#39;s important to do this before removing the old one)
                $ch                   = curl_init();
                $options[CURLOPT_URL] = $urls[$i++]; // increment i
                curl_setopt_array($ch, $options);
                curl_multi_add_handle($master, $ch);

                // remove the curl handle that just completed
                curl_multi_remove_handle($master, $done[&#39;handle&#39;]);
            } else {
                // request failed.  add error handling.
            }
        }
    } while ($running);

    curl_multi_close($master);
    return true;
}
Nach dem Login kopieren

Ändern Sie es. Fügen Sie einfach eine Beurteilung hinzu, wenn Sie eine neue URL hinzufügen. // Wenn $i gleich der Größe des $urls-Arrays ist, besteht keine Notwendigkeit, es zu erhöhen.

function rolling_curl($urls, $callback, $custom_options = null)
{//多个url访问

    // make sure the rolling window isn&#39;t greater than the # of urls
    $rolling_window = 5;
    $rolling_window = (sizeof($urls) < $rolling_window) ? sizeof($urls) : $rolling_window;

    $master   = curl_multi_init();
    $curl_arr = array();

    // add additional curl options here
    $std_options = array(
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_MAXREDIRS      => 5
        );
    $options = ($custom_options) ? ($std_options + $custom_options) : $std_options;

    // start the first batch of requests
    for ($i = 0; $i < $rolling_window; $i++) {
        $ch                   = curl_init();
        $options[CURLOPT_URL] = $urls[$i];
        curl_setopt_array($ch, $options);
        curl_multi_add_handle($master, $ch);
    }

    do {
        while (($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);
        if ($execrun != CURLM_OK) {
            break;
        }

        // a request was just completed -- find out which one
        while ($done = curl_multi_info_read($master)) {
            $info = curl_getinfo($done[&#39;handle&#39;]);
            if ($info[&#39;http_code&#39;] == 200) {
                $output = curl_multi_getcontent($done[&#39;handle&#39;]);

                // request successful.  process output using the callback function.
                $callback($output);

                // start a new request (it&#39;s important to do this before removing the old one)
                // 当$i等于$urls数组大小时不用再增加了
                if($i<sizeof($urls)){
                    $ch                   = curl_init();
                    $options[CURLOPT_URL] = $urls[$i++]; // increment i
                    curl_setopt_array($ch, $options);
                    curl_multi_add_handle($master, $ch);
                }
                // remove the curl handle that just completed
                curl_multi_remove_handle($master, $done[&#39;handle&#39;]);
            } else {
                // request failed.  add error handling.
            }
        }
    } while ($running);

    curl_multi_close($master);
    return true;
}
Nach dem Login kopieren

Das ist es, es ist vorbei. Schreiben Sie es auf, damit Sie es nicht vergessen.

Das obige ist der detaillierte Inhalt vonÜber PHP Curl asynchrone gleichzeitige Anfrage http. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage