2011-03-28 48 views
4

我使用rolling-curl [https://github.com/LionsAd/rolling-curl]库异步检索大量Web资源中的内容,作为一个计划任务。该库允许您设置并发CURL连接的最大数量,并且我从20开始,但后来升级到50以提高速度。cURL有时返回空白字符串作为有效的URL

看来,我每次运行它,任意网站中的数千正在处理失败,并返回一个空白字符串。看起来我拥有的并发连接越多,获得的失败请求就越多。下一次尝试运行该功能时,一次失败的相同网址可能会有效。有什么可能导致这种情况,我该如何避免它?

+1

务必检查您的CURL超时设置。 – DADU 2011-03-28 19:03:53

+0

当我添加VERBOSE选项时,似乎服务器正在为某些请求返回空响应。 – MarathonStudios 2011-03-29 01:03:09

+1

你可以添加一些代码,所以我们可以看到吗? – Jaanus 2011-05-05 19:39:37

回答

0

一般而言,你认为这不应该发生。

在访问外部服务器的情况下,情况并非如此。您的代码应完全了解可能无法响应的服务器,不能及时响应或响应错误。 HTTP过程允许事情发生错误。如果你到达服务器,你应该得到一个HTTP错误代码的通知(虽然这不总是会发生),但网络问题也可能不会产生或无用的响应。

不要相信外部输入。这是问题的根源。

在您的具体情况下,您会一致地增加请求数量。这将创建更多的请求,打开套接字和其他用途。要找到确切问题的解决方案,您需要对服务器进行高级访问,以便查看日志文件并监视打开的连接和其他问题。最好在测试服务器上测试它,而不用任何其他软件创建连接,以便您能够找出问题。

但是,如果你做得很好,你只有不确定性。例如,由于请求太多,您可能会被外部服务器阻止。您可能会陷入一些安全过滤器,如DDOS过滤器等。请求数量(自动或手动)的监视和自定义将为您生成最稳定的解决方案。您也可以接受这些丢失的请求,并处理一个稳定的队列,以确保您在某个特定时间获取内容。

1

一切吕克·弗兰肯写的是准确的,他的回答使我解决我的版本提问的问题,这就是:

远程服务器上根据自己的,充满变数,时间表作出回应。为了给他们足够的时间做出响应,设置两个cURL参数以提供大量时间非常重要。它们是:

CURLOPT_CONNECTTIMEOUT => 30 
    CURLOPT_TIMEOUT => 30 

您可以尝试更长和更短的时间,直到找到最大限度地减少错误的东西。但是,如果你使用curl/multi-curl/rollingcurl获得间歇性的非响应,那么你很可能以这种方式解决大部分问题。

相关问题