我正在尝试使用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);
}