最佳的curl超时时间和连接超时时间取值

3

大家好

我正在开发一个小型爬虫引擎,使用curl从各个网站请求页面。我的问题是,您建议我将连接超时和超时值设置为多少?我通常会爬取包含大量图像和文本的页面。


你应该接受一些回答并标记为正确答案。 - zerkms
如果你想要爬取数据,应该设置为无超时,并且不要同时生成多个curl请求(顺序执行),你应该使用fork来生成多个curl进程。 - ajreal
@zerkms:不知道,谢谢提醒。 - Imran Omar Bukhsh
@ajreal:谢谢你的指引。将来会研究一下。那么,针对单页,你有什么最好的建议吗? - Imran Omar Bukhsh
5个回答

10

cURL支持两种不同的超时时间。
对于CURLOPT_CONNECTTIMEOUT,网站包含多少文本或引用多少像图片这样的其他资源并不重要,因为这是一个连接超时,直到建立连接之前甚至服务器也无法知道所请求页面的大小。
而对于CURLOPT_TIMEOUT,就很重要了。即使很大的页面只需要几个数据包就可以传输完成,但服务器可能需要更多时间来组装输出。此外,重定向和其他因素(如代理)也会显著增加响应时间。

一般来说,"最佳值"取决于您的要求以及网络和服务器的条件。这些条件是变化的,因此没有"最佳值"。
我建议使用相对较短的超时时间,并稍后重试下载失败的内容。

顺便提一下,cURL不会自动下载响应中引用的资源。您需要手动调用curl_exec进行进一步下载(并设置新的超时时间)。


1
如果您将其设置得太高,那么您的脚本将会很慢,因为一个不可用的URL将需要在设置的CURLOPT_TIMEOUT时间内完成处理。如果您不使用代理,则可以设置以下值:
CURLOPT_TIMEOUT = 3 CURLOPT_CONNECTTIMEOUT = 1
然后您可以在以后的时间检查失败的URL。

1

最好的回答是Rik的。

我有一个代理检查器,在我的基准测试中,我发现大多数工作代理连接只需不到10秒钟。

因此,我使用10秒钟的ConnectionTimeOut和TimeOut,但这只是针对我的情况。您必须决定要使用多长时间,因此请从大量开始,使用curl_getinfo查看时间基准,并减少该值。

注意:对于我来说,需要超过5或10秒才能连接的代理是无用的,这就是为什么我使用这些值的原因。


0

是的。如果您的目标是代理查询另一个站点,这样的级联连接将需要像这些值一样长的时间来执行curl调用。

特别是当您遇到间歇性的curl问题时,请首先检查这些值。


-1

我使用

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);

你尝试过多少不同的网站?浏览了多少页面?成功率如何? - Imran Omar Bukhsh
它实际上运行得非常好...这是我其中一个代理扫描脚本中的一部分,因此它期望长时间连接和响应时间。 - Carter Cole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接