cURL导致页面挂起

时间:2011-06-14 16:24:58

标签: php curl

我正在使用当前代码尝试使用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&param2=2",
    "script_url?param1=5&param2=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>";

4 个答案:

答案 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完成处理的原因