2010-02-19 77 views
5

我正在使用'滚动'cURL多实现(如this SO post,基于this cURL code)。它可以同时处理数以千计的URL,最多可以使用100个请求,5个脚本作为守护进程运行(我知道,这应该用C或其他语言编写)。cURL多挂/忽略超时

下面是问题:在处理大约200,000个URL(跨越5个实例)之后,curl_multi_exec()似乎中断了脚本的所有实例。我尝试关闭脚本,然后重新启动,并且发生同样的事情(不是在20万个URL之后,而是在重新启动之后),脚本挂起呼叫curl_multi_exec()

我把脚本置于'single'模式,在一次处理一个常规的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分钟后等待的。

我有一堆测试/检查还没有做,但也许这可能会与某人打铃。

+0

通过重新启动持续的挂起听起来像是远程服务器调节连接的问题。 – 2015-02-03 07:23:29

+0

在处理之前使用'shuffle()'来获胜。 – 2017-01-16 22:49:05

回答

8

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

从我所知道的,curl_multi_exec()不会返回,直到所有的DNS(失败或成功)解决。如果有一群不良域名的网址curl_multi_exec()不至少返回:

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

这里是别人who has discovered this

就在上卷曲的多职能的异步特性注: DNS查找不是(据我所知现在)异步。因此,如果您的群组的一个DNS查找失败,那么之后的URL列表中的所有内容也会失败。我们实际上更新了我们的hosts.conf(我认为?)文件在我们的服务器每天为了解决这个问题。它获取IP地址,而不是查看它们。我相信它正在努力,但不确定它是否在cURL中发生了变化。

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

6

我觉得你的问题是相关型号到:

(62)CURLOPT_TIMEOUT不与常规多和multi_socket接口正常工作。应用程序的解决方法是一旦时间到,简单地删除简单的句柄。

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

如果这是你应该看你的卷曲处理的超时,并从多池中删除的情况。

+1

正是我在找的东西。将尝试一些测试代码,看看会发生什么。 – 2010-02-19 22:38:32