【发布时间】: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多接口这样的事情。