PHP cURL多处理性能比正常cURL慢

时间:2015-05-23 12:56:27

标签: php curl

我正在尝试使用cURL curl_multi_init()作为加速请求的方法。 我所经历的是,使用多句柄的请求初始化时间比使用curl_init()的请求要长。

以下是两个相同请求的示例。 一致多请求比单个请求长约4/5倍。 两个请求中的cURL选项都是相同的。在此示例中,多cURL仅发出一个请求。

其他信息:PHP 5.3.3 / cURL 7.21.0,Windows server 2008 / IIS 7x。

我对这可能导致这种缓慢反应的原因感到非常震惊。正在向位于同一网络的服务器发出请求,正常cURL的使用年数给了我这种请求的经验,这种请求,对于非多处理的这个特定后端,平均在0.2 / 0.3秒之间

问题是:什么可能导致多cURL请求的这种缓慢。

下面是测试的结果,两个请求,一个用curl_init()完成,另一个用curl_multi_init(都在同一个脚本中)。 请注意cURL信息,请求在header_size,request_size,size_upload,size_download和download_content_length方面完全相同。

使用正常cURL进行测试:

Array
(
    [url] => http://myurl.com
    [content_type] => text/xml;charset=UTF-8
    [http_code] => 200
    [header_size] => 261
    [request_size] => 312
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.203
    [namelookup_time] => 0
    [connect_time] => 0.015
    [pretransfer_time] => 0.015
    [size_upload] => 174
    [size_download] => 236
    [speed_download] => 1162
    [speed_upload] => 857
    [download_content_length] => 236
    [upload_content_length] => 0
    [starttransfer_time] => 0.203
    [redirect_time] => 0
)

使用多cURL进行测试(注意速度上传/下载速度较慢,连接和名称查找时间较长):

Array
(
    [client] => Array
        (
            [url] => http://myurl.com
            [content_type] => text/xml;charset=UTF-8
            [http_code] => 200
            [header_size] => 261
            [request_size] => 312
            [filetime] => -1
            [ssl_verify_result] => 0
            [redirect_count] => 0
            [total_time] => 1.047
            [namelookup_time] => 0.61
            [connect_time] => 0.61
            [pretransfer_time] => 0.61
            [size_upload] => 174
            [size_download] => 236
            [speed_download] => 225
            [speed_upload] => 166
            [download_content_length] => 236
            [upload_content_length] => 0
            [starttransfer_time] => 1.047
            [redirect_time] => 0
            [multi_handle_info] => Array
                (
                    [msg] => 1
                    [result] => 0
                    [handle] => Resource id #5
                )

        )

)

多cURL的代码示例(选项与普通cURL的代码相同):

$curl = array();        
$result = array();      
$mh = curl_multi_init();

foreach (array_keys($queries) as $id) {

    $curl[$id] = curl_init();           
    curl_setopt($curl[$id], CURLOPT_URL,$queries[$id]['url']); 
    curl_setopt($curl[$id], CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($curl[$id], CURLOPT_CONNECTTIMEOUT,60); 
    curl_setopt($curl[$id], CURLOPT_DNS_CACHE_TIMEOUT,3600); 
    curl_setopt($curl[$id], CURLOPT_TIMEOUT, 240);      
    curl_setopt($curl[$id], CURLOPT_POSTFIELDS, $queries[$id]['post']);         

    curl_multi_add_handle($mh, $curl[$id]);
}

$running = null;
do {
    curl_multi_exec($mh, $running);             
} while($running > 0);

// get content and remove handles
foreach($curl as $id => $c) {

    $result[$id] = curl_multi_getcontent($c);           
    curl_multi_remove_handle($mh, $c);
}

0 个答案:

没有答案