为啥 Curl 会比网络浏览器慢?
Posted
技术标签:
【中文标题】为啥 Curl 会比网络浏览器慢?【英文标题】:Why could Curl be slower than a web browser?为什么 Curl 会比网络浏览器慢? 【发布时间】:2011-04-09 20:30:15 【问题描述】:我正在使用this class 向网站发出一个 GET 和另一个 POST 请求(第一个请求是设置一个 cookie)。我正在使用来自 wampserver dot com 的 wamp 在带有 virtualbox 的 Win XP 虚拟机中进行测试。这 2 个请求需要 10 到 18 秒(使用 curl),但如果我直接通过同一虚拟机中的 webbrowser 发出这些请求,网站只需几秒钟即可加载,它会检索所有图像、css 等。
是什么导致 curl 工作如此缓慢?有办法解决吗?
【问题讨论】:
可能是您的浏览器缓存了一些图片等。清空您的浏览器缓存并再次尝试测试... 试过了,加载速度还是比 curl 快。 【参考方案1】:我遇到了同样的问题,使用 curl 命令。
如上所述 - 强制 ipv4 only dns 查找修复它。
curl -4 $url
# 又快又好
(我的 hosts 文件中已经有 ::1 localhost
- 但这没有帮助)。
【讨论】:
【参考方案2】:我在本地 Web 服务器上遇到了这个问题。我可以通过添加来修复
::1 localhost
到/etc/hosts/
文件。
这是ipv6 notation for 127.0.0.1
【讨论】:
【参考方案3】:这可能是由于 IPv6。
尝试添加
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
【讨论】:
【参考方案4】:Curl 可能正在尝试对服务器进行反向 DNS,但它不能,它只是挂在那里等待超时。
如果超时是由 IPV6 给出的,您可以尝试CURL_IPRESOLVE_V4
完全绕过它。这实际上取决于您的机器配置,并且更多是服务器故障的问题。
【讨论】:
有什么方法可以禁用反向 dns?我尝试使用 ip 而不是域(网站使用 ip 加载良好)但 curl 在 2 个请求上仍然需要 14 秒。 您可以直接在hosts
文件中输入地址,也可以尝试强制使用IPv4,看看是否有什么不同。
我使用了 fsockopen,它需要 30 多分钟。我们是否必须像 fsockopen('xxx.xxx.xxx.xxx',80) 那样使用它,而不是在那里提供域名......和标题 Host: hostname.com.. 不是吗?无论如何,让我试试弗兰基的评论。
@jarkam 但从你的测试中你能看出它是否与 DNS 相关吗?遵循简单的步骤并尝试消除可能性。【参考方案5】:
检查您的网络服务器日志并尝试找出来自普通网络浏览器的请求与来自 curl 的请求之间的任何差异
【讨论】:
所以您的意思是检查浏览器发送的标头,以便在 curl 中使用相同的标头会使 Web 服务器了解更多内容。我也有同样的问题。我正在通过 Firefox 访问服务器。它加载速度更快。但是当我使用 fsockopen('sitename.com') 和像 firefox 一样的标题时,它加载速度不快。大约需要 30 秒或更长时间。 @Jayapal Chandran 它总是需要更多时间,如果你计时它总是需要大约相同的时间。这是反向 DNS 超时,然后是真正的服务器响应(与超时相比,这并不重要)。 哦。实际上它是超过 30 秒像 60。反正。我所做的是添加到主机文件中,并通过指定 ip 尝试了 socket_create、socket_connect、socket_read、socket_write 函数。它工作得非常快。在这里我很困惑是因为在hosts文件中添加了ip还是直接给出了ip。我通过从主机中删除 ip 并再次使用 fsockopen 进行检查。这次它工作得非常快。这是以前从未发生过的。完全糊涂了。但它正在工作。会有什么影响? Jayapal,我使用的是 Windows,因为我不喜欢在我的主操作系统上安装网络服务器,而且我在 WinXP 虚拟机上只有一个网络服务器。现在我在 Linux 虚拟机上安装了一个网络服务器(回溯 4),curl 的运行速度快了 8 倍。如果您在 Windows 上遇到此问题,您应该尝试在 Linux 上运行脚本并比较结果。 更新:添加自定义标头以 curl 准确模拟 firefox 发送的内容,并且加载时间减少了约 50%。以上是关于为啥 Curl 会比网络浏览器慢?的主要内容,如果未能解决你的问题,请参考以下文章
我想问下php这个curl为啥耗时特长,我在浏览器直接访问url是有结果的
为啥我的机器运行速度超级慢?正常情况下都有那些进程启动项视该保留的?
DomCurl:Curl + JavaScript前端抓取小工具