【发布时间】:2014-01-06 21:00:21
【问题描述】:
我有一个门户网站,需要下载许多单独的 json 文件并以某种表单视图显示它们的内容。很多我的意思是至少 32 个单独的文件。
我已经尝试使用蛮力迭代的 cUrl,它需要大约 12.5 秒。
我已经尝试了 curl_multi_exec ,如http://www.php.net/manual/en/function.curl-multi-init.php 所示,使用下面的函数,它需要大约 9 秒。稍微好一点,但仍然非常缓慢。
function multiple_threads_request($nodes){
$mh = curl_multi_init();
$curl_array = array();
foreach($nodes as $i => $url)
{
$curl_array[$i] = curl_init($url);
curl_setopt($curl_array[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $curl_array[$i]);
}
$running = NULL;
do {
curl_multi_exec($mh,$running);
} while($running > 0);
$res = array();
foreach($nodes as $i => $url)
{
$res[$url] = curl_multi_getcontent($curl_array[$i]);
}
foreach($nodes as $i => $url){
curl_multi_remove_handle($mh, $curl_array[$i]);
}
curl_multi_close($mh);
return $res;
}
我意识到这是一项固有的昂贵操作,但有人知道其他可能更快的替代方案吗?
编辑:最后,我的系统限制了 curl_multi_exec 并将代码移动到生产机器上看到了显着的改进
【问题讨论】:
-
必须在后端完成吗?为什么不将获取移至客户端?一些 AJAX 魔术、主干视图和您的基本完成。在 waaaay 不到 9 秒。 ;-)
-
是的...我想过这个问题,但我必须轻松地重构约 75% 的工作,而这在短期内是无法完成的。从长远来看,这绝对是我应该做的。
-
缓存是一个选项吗?或显式或隐式。 (这在很大程度上与将 fetch 移动到客户端是正交的。)
-
如果您从 12.5 秒变为 9 秒,那么这是否意味着您最长的 cURL 请求是 9 秒,而其他 31 个小于 9 秒?使用
curl_multi_init()时有cURL限制吗? -
@user2191572
does that mean your longest cURL request is 9 seconds是的,这很有可能
标签: php performance