我正在使用rolling-curl [https://github.com/LionsAd/rolling-curl]库来异步检索来自大量Web资源的内容,作为计划任务的一部分。该库允许您设置最大并发CURL连接数,我从20开始,但后来升至50以提高速度。
似乎每次我运行它时,正在处理的几千个中的任意URL都会失败并返回一个空字符串。似乎我拥有的并发连接越多,我获得的请求失败的次数就越多。一次失败的相同url可能会在下次尝试运行该函数时起作用。可能导致这种情况的原因,我该如何避免呢?
答案 0 :(得分:1)
Luc Franken所写的一切都是准确的,他的回答引导我解决了我的提问者问题的版本,即:
远程服务器根据自己的,高度可变的计划进行响应。为了给它们足够的时间来响应,设置两个cURL参数以提供大量的时间是很重要的。他们是:
CURLOPT_CONNECTTIMEOUT => 30
CURLOPT_TIMEOUT => 30
您可以尝试更长和更短的时间,直到找到可以最大限度减少错误的内容。但是如果你得到卷曲/多卷曲/卷曲的间歇性非响应,你可以用这种方式解决大部分问题。
答案 1 :(得分:0)
一般来说,你认为这不应该发生。
在访问外部服务器的情况下,情况并非如此。您的代码应该完全了解可能无法响应的服务器,不及时响应或响应错误。在HTTP进程中允许事情可能出错。如果您到达服务器,您应该收到HTTP错误代码的通知(虽然并非总是如此),但网络问题也不会产生或无用的响应。
不要相信外部输入。这是问题的根源。
在具体情况下,您可以持续增加请求数量。这将创建更多请求,打开套接字和其他用途。要找到确切问题的解决方案,您需要对服务器的高级访问权限,以便您可以查看日志文件并监视打开的连接和其他问题。最好在测试服务器上对此进行测试,而无需任何其他软件创建连接,以便您可以隔离问题。
但是你做了多少测试,你只有不确定性。例如,您可能会被外部服务器阻止,因为您发出了太多请求。您可能会陷入某些安全过滤器(如DDOS过滤器等)。监控和自定义请求数量(自动或手动)将为您生成最稳定的解决方案。您也可以接受这些丢失的请求,只需处理一个稳定的队列,确保您在某个特定时刻获取内容。