【问题标题】:cURL multi hanging/ignoring timeoutcURL 多挂/忽略超时
【发布时间】:2011-01-18 20:35:28
【问题描述】:

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

这是问题所在:在处理约 200,000 个 URL(跨越 5 个实例)后,curl_multi_exec() 似乎对脚本的所有实例都中断了。我试过关闭脚本,然后重新启动,同样的事情发生了(不是在 200,000 个 URL 之后,而是在重新启动时),脚本挂起调用curl_multi_exec()

我将脚本置于“单一”模式,一次处理一个常规 cURL 句柄,效果很好(但这不是我需要的速度)。我的日志记录让我怀疑它可能遇到了一些缓慢/有问题的连接(因为它似乎经常在 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

我已将CURLOPT_TIMEOUT 设置为120,但在curl_multi_exec() 最终返回一些数据的情况下,需要等待10 分钟。

我还有一堆测试/检查要做,但我想这可能会给某人敲响警钟。

【问题讨论】:

  • 重启后持续挂起听起来像是远程服务器限制连接的问题。
  • 在处理之前使用shuffle(),以获得胜利。
  • 这个question也可能是相关的,我真的开始讨厌,并且不相信cURL多接口这样的事情。

标签: php curl


【解决方案1】:

经过多次测试,我相信我已经找到了导致此特定问题的原因。我并不是说其他​​答案不正确,只是在这种情况下不是我遇到的问题。

据我所知,curl_multi_exec() 在解决所有 DNS(失败或成功)之前不会返回。如果有一堆带有坏域的网址 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 中进行了更改。

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

【讨论】:

    【解决方案2】:

    我认为您的问题与:

    (62) CURLOPT_TIMEOUT 不能与常规的 multi 和 multi_socket 接口一起正常工作。应用程序的解决方法是在时间结束后简单地删除简单的句柄。

    另请参阅:http://curl.haxx.se/bug/view.cgi?id=2501457

    如果是这种情况,您应该注意 curl 句柄是否超时并将其从多池中删除。

    【讨论】:

    • 正是我想要的。将尝试一些测试代码,看看会发生什么。
    猜你喜欢
    • 2023-03-18
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多