我正在使用当前代码尝试使用cURL异步执行两个脚本。每个脚本都托管在不同的域上,大约需要30秒才能完成。我希望这些在后台运行,以便页面继续加载,但它一直挂起,直到它们完成。在思考cURL如何工作时,我完全错了吗?或者我做错了什么?
更新:
$.ajax({
type : 'POST',
url : 'ajax.php?mode=process',
data : '$url',
complete: function(data)
{
$('#test'+num).append('Operation successful.');
}
});
Num是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>";
答案 0 :(得分:3)
不幸的是,在脚本完成执行之前,您的页面将无法完成加载。即使您使用cURL Multi函数,这只适用于脚本运行时。
如果您需要在后台运行脚本,则必须找到另一种方法,例如在数据库中排队下载作业,以及cron运行脚本以每分钟检查一次该队列。
答案 1 :(得分:1)
将此作为curl请求的选项。
$CURL_OPTS = array(
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
);
答案 2 :(得分:0)
如果要异步执行此操作,则需要完成输出到页面,然后使用JQuery调用使用cURL加载数据的脚本。
答案 3 :(得分:0)
我知道这是一篇较老的帖子......但是我遇到了类似的问题,我能够绕过它...不确定它是否和你的一样,因为你只共享了部分代码,但是无论如何我会分享这个,因为我发现很难找到正确的答案,这听起来非常像我试图解决的问题:
我有一个ajax调用,调用a.php,a.php通过cURL CLI调用b.php来处理后台页面(使用PHP的exec()函数)b.php使用libcurl来搜索网站... b.php导致a.php停止响应我的ajax请求以检查scraper的状态。我发现原因是因为我将来自刮刀的信息存储到全局$ _SESSION var中...你不能在多个位置读取/写入同一个会话,所以我的周期性ajax请求a.php(这是使用与b.php上的cURL刮刀相同的会话被挂起。在整个cURL scraper中定期使用session_write_close()导致我的ajax请求不会挂起,因为会话不再阻止页面请求通过。
我有兴趣了解这是否是你的ajax请求挂起直到cURL完成处理的原因