Heim php教程 php手册 利用curl并发来提高页面访问速度

利用curl并发来提高页面访问速度

Jun 13, 2016 am 09:39 AM
aspnet Softwareprogrammierung

在我们平时的程序中难免出现同时访问几个接口的情况,平时我们用curl进行访问的时候,一般都是单个、顺序访问,假如有3个接口,每个接口耗时500毫秒那么我们三个接口就要花费1500毫秒了,这个问题太头疼了严重影响了页面访问速度,有没有可能并发访问来提高速度呢?今天就简单的说一下,利用curl并发来提高页面访问速度,
希望大家多指导。
1、老的curl访问方式以及耗时统计

function curl_fetch($url, $timeout=3){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    $errno = curl_errno($ch);
    if ($errno>0) {
        $data = false;
    }
    curl_close($ch);
    return $data;
}
function microtime_float()
{
   list($usec, $sec) = explode(" ", microtime());
   return ((float)$usec + (float)$sec);
}
$url_arr=array(
     "taobao"=>"http://www.taobao.com",
     "sohu"=>"http://www.sohu.com",
     "sina"=>"http://www.sina.com.cn",
     );
 $time_start = microtime_float();
 $data=array();
 foreach ($url_arr as $key=>$val)
 {
     $data[$key]=curl_fetch($val);
 }
 $time_end = microtime_float();
 $time = $time_end - $time_start;
 echo "耗时:{$time}";
?>
Nach dem Login kopieren

  



耗时:0.614秒
2、curl并发访问方式以及耗时统计

<?php
function curl_multi_fetch($urlarr=array()){
    $result=$res=$ch=array();
    $nch = 0;
    $mh = curl_multi_init();
    foreach ($urlarr as $nk => $url) {
        $timeout=2;
        $ch[$nch] = curl_init();
        curl_setopt_array($ch[$nch], array(
        CURLOPT_URL => $url,
        CURLOPT_HEADER => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => $timeout,
        ));
        curl_multi_add_handle($mh, $ch[$nch]);
        ++$nch;
    }
    /* wait for performing request */
    do {
        $mrc = curl_multi_exec($mh, $running);
    } while (CURLM_CALL_MULTI_PERFORM == $mrc);
 
    while ($running && $mrc == CURLM_OK) {
        // wait for network
        if (curl_multi_select($mh, 0.5) > -1) {
            // pull in new data;
            do {
                $mrc = curl_multi_exec($mh, $running);
            } while (CURLM_CALL_MULTI_PERFORM == $mrc);
        }
    }
 
    if ($mrc != CURLM_OK) {
        error_log("CURL Data Error");
    }
 
    /* get data */
    $nch = 0;
    foreach ($urlarr as $moudle=>$node) {
        if (($err = curl_error($ch[$nch])) == '') {
            $res[$nch]=curl_multi_getcontent($ch[$nch]);
            $result[$moudle]=$res[$nch];
        }
        else
        {
            error_log("curl error");
        }
        curl_multi_remove_handle($mh,$ch[$nch]);
        curl_close($ch[$nch]);
        ++$nch;
    }
    curl_multi_close($mh);
    return  $result;
}
$url_arr=array(
     "taobao"=>"http://www.taobao.com",
     "sohu"=>"http://www.sohu.com",
     "sina"=>"http://www.sina.com.cn",
     );
function microtime_float()
{
   list($usec, $sec) = explode(" ", microtime());
   return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
$data=curl_multi_fetch($url_arr);
$time_end = microtime_float();
$time = $time_end - $time_start;
 echo "耗时:{$time}";
?>
Nach dem Login kopieren

输出结果array('taobao'=>result,'sina'=>result,'baidu'=>result)  ;

 

耗时:0.316秒
帅气吧整个页面访问后端接口的时间节省了一半
3、curl相关参数
来自:http://cn2.php.net/manual/en/ref.curl.php
curl_close — Close a cURL session
curl_copy_handle — Copy a cURL handle along with all of its preferences
curl_errno — Return the last error number
curl_error — Return a string containing the last error for the current session
curl_exec — Perform a cURL session
curl_getinfo — Get information regarding a specific transfer
curl_init — Initialize a cURL session
curl_multi_add_handle — Add a normal cURL handle to a cURL multi handle
curl_multi_close — Close a set of cURL handles
curl_multi_exec — Run the sub-connections of the current cURL handle
curl_multi_getcontent — Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set
curl_multi_info_read — Get information about the current transfers
curl_multi_init — Returns a new cURL multi handle
curl_multi_remove_handle — Remove a multi handle from a set of cURL handles
curl_multi_select — Wait for activity on any curl_multi connection
curl_setopt_array — Set multiple options for a cURL transfer
curl_setopt — Set an option for a cURL transfer
curl_version — Gets cURL version information

原文地址:http://www.searchtb.com/2010/12/using-multicurl-to-improve-performance.html?spm=0.0.0.0.onjnnY

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

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Die Kombination von Vue.js und ASP.NET liefert Tipps und Anregungen zur Performance-Optimierung und Erweiterung von Webanwendungen. Die Kombination von Vue.js und ASP.NET liefert Tipps und Anregungen zur Performance-Optimierung und Erweiterung von Webanwendungen. Jul 29, 2023 pm 05:19 PM

Die Kombination von Vue.js und ASP.NET liefert Tipps und Anregungen zur Performance-Optimierung und Erweiterung von Webanwendungen.

Nutzung und Optimierungstechniken des MySQL-Verbindungspools in ASP.NET-Programmen Nutzung und Optimierungstechniken des MySQL-Verbindungspools in ASP.NET-Programmen Jun 30, 2023 pm 11:54 PM

Nutzung und Optimierungstechniken des MySQL-Verbindungspools in ASP.NET-Programmen

Zehn Möglichkeiten, wie generative KI die Softwareentwicklung verändern wird Zehn Möglichkeiten, wie generative KI die Softwareentwicklung verändern wird Mar 11, 2024 pm 12:10 PM

Zehn Möglichkeiten, wie generative KI die Softwareentwicklung verändern wird

Wie kann ich im ASP.NET-Programm erneut eine Verbindung zu MySQL herstellen? Wie kann ich im ASP.NET-Programm erneut eine Verbindung zu MySQL herstellen? Jun 29, 2023 pm 02:21 PM

Wie kann ich im ASP.NET-Programm erneut eine Verbindung zu MySQL herstellen?

Die Kombination von Vue.js und ASP.NET ermöglicht die Entwicklung und Bereitstellung von Anwendungen auf Unternehmensebene Die Kombination von Vue.js und ASP.NET ermöglicht die Entwicklung und Bereitstellung von Anwendungen auf Unternehmensebene Jul 29, 2023 pm 02:37 PM

Die Kombination von Vue.js und ASP.NET ermöglicht die Entwicklung und Bereitstellung von Anwendungen auf Unternehmensebene

Wie konfiguriere und verwende ich den MySQL-Verbindungspool im ASP.NET-Programm richtig? Wie konfiguriere und verwende ich den MySQL-Verbindungspool im ASP.NET-Programm richtig? Jun 29, 2023 pm 12:56 PM

Wie konfiguriere und verwende ich den MySQL-Verbindungspool im ASP.NET-Programm richtig?

Empfohlene Konfiguration für die ASP.NET-Entwicklung mit Visual Studio unter Linux Empfohlene Konfiguration für die ASP.NET-Entwicklung mit Visual Studio unter Linux Jul 06, 2023 pm 08:45 PM

Empfohlene Konfiguration für die ASP.NET-Entwicklung mit Visual Studio unter Linux

Was sind die integrierten Objekte in Aspnet? Was sind die integrierten Objekte in Aspnet? Nov 21, 2023 pm 02:59 PM

Was sind die integrierten Objekte in Aspnet?

See all articles