代码之家  ›  专栏  ›  技术社区  ›  Tim Lytle

卷取多挂起/忽略超时

  •  6
  • Tim Lytle  · 技术社区  · 15 年前

    我正在使用“滚动”curl多实现(比如 this SO post 基于 this cURL code )。它可以同时处理多达100个请求的数千个URL,其中5个脚本实例作为守护进程运行(是的,我知道,这应该用C或其他语言编写)。

    问题是:在处理大约200000个URL之后(跨5个实例) curl_multi_exec() 脚本的所有实例似乎都已中断。我尝试关闭脚本,然后重新启动,同样的事情也会发生(不是在200000个URL之后,而是在重新启动时)。 脚本挂起调用 curl_multi_exec()。 .

    我将脚本设置为“单一”模式,一次处理一个常规的旋度句柄,这很好地工作(但速度不是我需要的)。我的日志记录让我怀疑它可能碰到了一个缓慢/有问题的连接补丁(因为它似乎经常在URL上处理,然后再次挂起),但是 那就意味着我 CURLOPT_TIMEOUT 正在忽略单个句柄 . 或者可能只是通过curl运行那么多请求。

    有人听说过这样的事吗?

    示例代码(再次基于 this ):

    //some logging shows it hangs right here, only looping a time or two
    //so the hang seems to be in the curl call
    while(($execrun = 
        curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);
    
    //code to check for error or process whatever returned
    

    我有 CuropoptIt超时 设置为 120 但是在 curl_multi_exec()。 最后返回一些数据,等待了10分钟。

    我还有很多测试/检查工作要做,但我想这可能会给某些人敲响警钟。

    2 回复  |  直到 15 年前
        1
  •  9
  •   Tim Lytle    15 年前

    经过多次测试,我相信我已经找到了导致这个特殊问题的原因。我不是说另一个答案是错误的,只是在这种情况下,我没有这个问题。

    据我所知, curl_multi_exec() 在解决所有DNS(失败或成功)之前不会返回。如果有一堆有坏域名的URL curl_multi_exec()。 至少不会返回:

    (time it takes to get resolve error) * (number of urls with bad domain)
    

    这是别人 who has discovered this :

    只需注意curl_的多功能的异步性质:DNS查找不是异步的(据我今天所知)。因此,如果对您的组进行一次DNS查找失败,那么URL列表中的所有内容也会失败。我们实际上更新了hosts.conf(我想是吧?)每天在我们的服务器上归档,以便解决这个问题。它在那里获取IP地址,而不是查找它们。我相信它正在被加工,但还不确定它的卷曲度是否发生了变化。

    此外,测试表明curl(至少我的版本)确实遵循 CURLOPT_CONNECTTIMEOUT 设置。当然,多周期的第一步可能仍然需要很长时间,因为curl等待每个URL解析或超时。

        2
  •  7
  •   Goran Rakic    15 年前

    我认为你的问题涉及到:

    (62)Curlopt_超时不能与常规的多和多插座接口一起正常工作。应用程序的解决方案是,一旦时间到了,就简单地删除这个简单的手柄。

    参见: http://curl.haxx.se/bug/view.cgi?id=2501457

    如果是这样的话,你应该注意你的卷发手柄是否超时,并将它们从多功能池中移除。