我正在使用当前代码尝试使用cURL异步执行两个脚本。每个脚本都托管在不同的域上,需要大约30秒才能完成。我希望这些在后台运行,以便页面可以继续加载,但它会一直挂起直到完成。我在考虑cURL的工作原理时完全错了吗?或者我做错了什么?cURL导致页面挂起
UPDATE:
$.ajax({
type : 'POST',
url : 'ajax.php?mode=process',
data : '$url',
complete: function(data)
{
$('#test'+num).append('Operation successful.');
}
});
货号是div的ID。它们是通过代码生成的。所有这些都正常工作,除了cURL锁定服务器,直到完成处理文件。
下面的代码现在在另一个页面上,专门用于处理从上面的jQuery ajax调用传入的URL。
$cURLs = array(
"script_url?param1=1¶m2=2",
"script_url?param1=5¶m2=6");
$result = array();
$mh = curl_multi_init();
foreach ($data as $id => $d)
{
$cURLs[$id] = curl_init();
$url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
curl_setopt($cURLs[$id], CURLOPT_URL, $url);
curl_setopt($cURLs[$id], CURLOPT_HEADER, 0);
curl_setopt($cURLs[$id], CURLOPT_RETURNTRANSFER, 1);
if (is_array($d))
{
if (!empty($d['post']))
{
curl_setopt($cURLs[$id], CURLOPT_POST, 1);
curl_setopt($cURLs[$id], CURLOPT_POSTFIELDS, $d['post']);
}
}
if (!empty($options))
curl_setopt_array($cURLs[$id], $options);
curl_multi_add_handle($mh, $cURLs[$id]);
}
$running = null;
do
{
curl_multi_exec($mh, $running);
} while($running > 0);
foreach($cURLs as $id => $c)
{
$result[$id] = curl_multi_getcontent($c);
curl_multi_remove_handle($mh, $c);
}
curl_multi_close($mh);
echo "<pre>" . print_r($result, 1) . "</pre>";
调用卷曲就像调用任何其它功能 - 脚本块,直到函数返回。大多数功能几乎是瞬时的,所以你不会注意到。 curl完全依赖于远程资源的作用(以及它自己的超时参数)。 – 2011-06-14 16:29:59