为什么Curl比Web浏览器慢?

7
我正在使用这个类来向网站发送GET和POST请求(第一个请求是为了设置cookie)。我在使用wampserver dot com提供的wamp时,在Win XP虚拟机中进行测试。使用curl进行2次请求需要10至18秒,但如果我直接通过同一虚拟机中的Web浏览器进行请求,则网站会在几秒钟内加载,并检索所有图像、CSS等。
curl为什么如此缓慢?有没有办法解决它?

可能是您的浏览器缓存了一些图像等内容。清空浏览器缓存,然后再次尝试测试... - David Gelhar
尝试过了,依然比curl加载更快。 - jarkam
5个回答

5

我遇到了同样的问题,使用curl命令。

如上所述-强制使用ipv4 DNS查找解决了它。

curl -4 $url # 快速且流畅

(我已经在我的hosts文件中添加了::1 localhost,但这并没有帮助)。


3

Curl可能会尝试反向解析服务器,但由于无法解析,它会在那里等待一段时间,直到超时。

如果IPv6造成了超时问题,您可以尝试使用CURL_IPRESOLVE_V4来完全绕过它。这实际上取决于您的机器配置,更多是针对Server Fault的问题。


有没有办法禁用反向DNS?我尝试使用IP而不是域名(使用IP加载网站没有问题),但cURL在两个请求上仍然需要大约14秒钟。 - jarkam
您可以直接在 hosts 文件中输入地址,或尝试强制使用 IPv4 看看是否有任何区别。 - Frankie
我使用了fsockopen,但它花费了超过30分钟的时间。我们是否应该像fsockopen('xxx.xxx.xxx.xxx',80)这样使用它,而不是在那里提供域名...并且在标题中Host:hostname.com..是吗?无论如何,让我尝试一下Frankie的评论。 - Jayapal Chandran
1
@jarkam,但从你的测试中,你能看出这是否与DNS有关吗?按照简单的步骤尝试排除可能性。 - Frankie

2

检查您的Web服务器日志,并尝试查找正常Web浏览器请求和curl请求之间的任何差异。


2
那么你的意思是检查浏览器发送的标头,这样在使用相同的标头进行curl操作时,Web服务器会理解更多内容。我也遇到了同样的问题。我通过Firefox访问服务器,它加载得更快。但是当我使用与Firefox相同的标头fsockopen('sitename.com')时,它没有快速加载。它需要大约30秒或更长时间。 - Jayapal Chandran
@Jayapal Chandran,它总是需要更多时间,如果你计时的话,它总是需要大约相同的时间。这是反向DNS超时和真实服务器响应(与超时相比并不重要)。 - Frankie
哦,其实不仅是30秒,而是60秒左右。无论如何,我在hosts文件中添加了IP,并通过指定IP使用socket_create、socket_connect、socket_read、socket_write函数进行尝试。它运行得非常快。这里让我感到困惑的是是否因为在hosts文件中添加了IP或者直接提供IP的缘故。我尝试将IP从hosts文件中删除,并再次使用fsockopen进行测试。这次它运行得非常快。这以前从未发生过,所以我非常困惑,但这确实起作用了。会有什么影响呢? - Jayapal Chandran
Jayapal,我之前使用Windows是因为我不喜欢在我的主操作系统上安装Web服务器,而且我只有在WinXP虚拟机上才有Web服务器。现在我在Linux虚拟机(Backtrack 4)上安装了Web服务器,curl的速度快了8倍。如果你在Windows上遇到这个问题,你应该尝试在Linux上运行你的脚本并比较结果。 - jarkam
1
更新:已添加自定义标头到模拟 Firefox 发送的 curl 中,加载时间减少了约 50%。 - jarkam

2

这可能是由于IPv6的原因。

尝试添加

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

0

我在本地Web服务器上遇到了这个问题。我通过添加以下内容来解决它

::1 localhost

写入/etc/hosts/文件。

这是127.0.0.1的IPv6表示法


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