file_get_contents 比 浏览器慢 ?

太久 2015-09-22 04:02:42
抓取纯文本页面内容,用file_get_contents费时大约1秒左右,chrome下直接打开测试发现才用来300ms。
1. 这是为何?
2. 要用curl?

网络稳定,页面内容很少,仅文本。
...全文
504 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
傲雪星枫 2015-10-01
  • 打赏
  • 举报
回复
其实,换台机器试试更容易找到问题。
ihefe 2015-09-30
  • 打赏
  • 举报
回复
file_get_contents 慢到1秒 可能是网络问题 ,不然这函数也太差劲了 慢先从内部排查到外部 1. 检测代码执行时间 2. 检测请求耗时
智商众筹 2015-09-29
  • 打赏
  • 举报
回复
dns缓存?
锕Kun 2015-09-24
  • 打赏
  • 举报
回复
缓冲,你尝试过么?我想效果可能会快一些!
xuzuning 2015-09-23
  • 打赏
  • 举报
回复
你本来是 file_get_contents 和 浏览器 比 现在是 file_get_contents 和 curl 比 你到底是想谁和谁比? 其实攀比是没有必要的,网络上千变万化、服务器也有个响应时间问题 具体问题要具体对待,用 curl 取不到的,用 file_get_contents 反而能取到。这种情况经常发生
太久 2015-09-23
  • 打赏
  • 举报
回复
引用 14 楼 hellodifa 的回复:
[quote=引用 12 楼 zengyi906 的回复:] [quote=引用 10 楼 hellodifa 的回复:] [quote=引用 1 楼 jam00 的回复:] 获取网络上的数据用curl好些,特别是在多次获取的时候,比file_get_contents快 chrome 那个就不知道了
你说的没有错误,file_get_contents在多次访问同一url时,会出现偶尔慢,甚至无响应等情况。 之前也一直没有搞清楚具体原因,通过浏览器发现一点也不慢,就没管,后来有次无意间读php源码,发现file_get_contents在发起请求时并不会发送"connection" HTTP头!!! 若果不发送"connection" HTTP头,目标服务器会认为tcp请求还处在keep-alive,因此不会close,那么什时候才能close呢,这就得看目标网站的服务器配置了,有的是几秒有的可能更慢。 可以通过wireshark抓包就能看到,用curl的话,目标网站会close tcp connection,而用file_get_contents时则不会。 有一种解决方案,在使用时加上所需要的header,你可以试试,希望对你有帮助。

$context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n')));
file_get_contents("$your_url", false, $context);
[/quote] 有加的[/quote] 有没有可能是dns慢? ping your_url 得到 url_ip 试试呢?

$context = stream_context_create(array('http' => array('header'=>'Host: $your_url\r\n')));
file_get_contents("$url_ip", false, $context);

[/quote] 同一台电脑呀,要慢不是一起慢么?都用的一个url
夏之冰雪 2015-09-23
  • 打赏
  • 举报
回复
引用 12 楼 zengyi906 的回复:
[quote=引用 10 楼 hellodifa 的回复:] [quote=引用 1 楼 jam00 的回复:] 获取网络上的数据用curl好些,特别是在多次获取的时候,比file_get_contents快 chrome 那个就不知道了
你说的没有错误,file_get_contents在多次访问同一url时,会出现偶尔慢,甚至无响应等情况。 之前也一直没有搞清楚具体原因,通过浏览器发现一点也不慢,就没管,后来有次无意间读php源码,发现file_get_contents在发起请求时并不会发送"connection" HTTP头!!! 若果不发送"connection" HTTP头,目标服务器会认为tcp请求还处在keep-alive,因此不会close,那么什时候才能close呢,这就得看目标网站的服务器配置了,有的是几秒有的可能更慢。 可以通过wireshark抓包就能看到,用curl的话,目标网站会close tcp connection,而用file_get_contents时则不会。 有一种解决方案,在使用时加上所需要的header,你可以试试,希望对你有帮助。

$context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n')));
file_get_contents("$your_url", false, $context);
[/quote] 有加的[/quote] 有没有可能是dns慢? ping your_url 得到 url_ip 试试呢?

$context = stream_context_create(array('http' => array('header'=>'Host: $your_url\r\n')));
file_get_contents("$url_ip", false, $context);

太久 2015-09-23
  • 打赏
  • 举报
回复
引用 13 楼 hellodifa 的回复:
[quote=引用 9 楼 zengyi906 的回复:] [quote=引用 5 楼 xuzuning 的回复:] 你是如何计时的?不能仅凭感觉
microtime(true); 前后各一次相减.
引用 6 楼 fdipzone 的回复:
用curl试试。
curl每次大约300ms,确实会快一点,http头都应该是相同的
引用 8 楼 zy205817 的回复:
这个有可能是网络的原因,多测试几次看看
应该不是网络原因,因为就现在我用2段不同的脚本同时去测还是curl快。[/quote] 建议用curl吧,我已经把我的所有代码,用到file_get_contents获取网页内容的地方全部换成curl了。你可以自己封装一个更灵活的curl库,根据使用场景封装出用起来也一样方便的方法,毕竟curl强大得多呀。 [/quote] 恩,好的,谢谢你的建议。还不太熟悉,我两个都试试。
夏之冰雪 2015-09-23
  • 打赏
  • 举报
回复
引用 9 楼 zengyi906 的回复:
[quote=引用 5 楼 xuzuning 的回复:] 你是如何计时的?不能仅凭感觉
microtime(true); 前后各一次相减.
引用 6 楼 fdipzone 的回复:
用curl试试。
curl每次大约300ms,确实会快一点,http头都应该是相同的
引用 8 楼 zy205817 的回复:
这个有可能是网络的原因,多测试几次看看
应该不是网络原因,因为就现在我用2段不同的脚本同时去测还是curl快。[/quote] 建议用curl吧,我已经把我的所有代码,用到file_get_contents获取网页内容的地方全部换成curl了。你可以自己封装一个更灵活的curl库,根据使用场景封装出用起来也一样方便的方法,毕竟curl强大得多呀。
太久 2015-09-23
  • 打赏
  • 举报
回复
引用 10 楼 hellodifa 的回复:
[quote=引用 1 楼 jam00 的回复:] 获取网络上的数据用curl好些,特别是在多次获取的时候,比file_get_contents快 chrome 那个就不知道了
你说的没有错误,file_get_contents在多次访问同一url时,会出现偶尔慢,甚至无响应等情况。 之前也一直没有搞清楚具体原因,通过浏览器发现一点也不慢,就没管,后来有次无意间读php源码,发现file_get_contents在发起请求时并不会发送"connection" HTTP头!!! 若果不发送"connection" HTTP头,目标服务器会认为tcp请求还处在keep-alive,因此不会close,那么什时候才能close呢,这就得看目标网站的服务器配置了,有的是几秒有的可能更慢。 可以通过wireshark抓包就能看到,用curl的话,目标网站会close tcp connection,而用file_get_contents时则不会。 有一种解决方案,在使用时加上所需要的header,你可以试试,希望对你有帮助。

$context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n')));
file_get_contents("$your_url", false, $context);
[/quote] 有加的
太久 2015-09-23
  • 打赏
  • 举报
回复
还要继续测,好像一些jsondecode的工作影响也不少。我再确认一下
夏之冰雪 2015-09-23
  • 打赏
  • 举报
回复
引用 1 楼 jam00 的回复:
获取网络上的数据用curl好些,特别是在多次获取的时候,比file_get_contents快 chrome 那个就不知道了
你说的没有错误,file_get_contents在多次访问同一url时,会出现偶尔慢,甚至无响应等情况。 之前也一直没有搞清楚具体原因,通过浏览器发现一点也不慢,就没管,后来有次无意间读php源码,发现file_get_contents在发起请求时并不会发送"connection" HTTP头!!! 若果不发送"connection" HTTP头,目标服务器会认为tcp请求还处在keep-alive,因此不会close,那么什时候才能close呢,这就得看目标网站的服务器配置了,有的是几秒有的可能更慢。 可以通过wireshark抓包就能看到,用curl的话,目标网站会close tcp connection,而用file_get_contents时则不会。 有一种解决方案,在使用时加上所需要的header,你可以试试,希望对你有帮助。

$context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n')));
file_get_contents("$your_url", false, $context);
太久 2015-09-23
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
你是如何计时的?不能仅凭感觉
microtime(true); 前后各一次相减.
引用 6 楼 fdipzone 的回复:
用curl试试。
curl每次大约300ms,确实会快一点,http头都应该是相同的
引用 8 楼 zy205817 的回复:
这个有可能是网络的原因,多测试几次看看
应该不是网络原因,因为就现在我用2段不同的脚本同时去测还是curl快。
码无边 2015-09-23
  • 打赏
  • 举报
回复
这个有可能是网络的原因,多测试几次看看
一起混吧 2015-09-23
  • 打赏
  • 举报
回复
你是如何计时的?方便的话可以把URL发出来让大家测试下。
xuzuning 2015-09-23
  • 打赏
  • 举报
回复
你是如何计时的?不能仅凭感觉
傲雪星枫 2015-09-23
  • 打赏
  • 举报
回复
用curl试试。
放胆往前冲 2015-09-23
  • 打赏
  • 举报
回复
没试过。。。
太久 2015-09-23
  • 打赏
  • 举报
回复
引用 17 楼 xuzuning 的回复:
你本来是 file_get_contents 和 浏览器 比 现在是 file_get_contents 和 curl 比 你到底是想谁和谁比? 其实攀比是没有必要的,网络上千变万化、服务器也有个响应时间问题 具体问题要具体对待,用 curl 取不到的,用 file_get_contents 反而能取到。这种情况经常发生
浏览器咯,走题了。curl和file_get_contents相差不大,前者稍快,一起讨论呗。 你说的这种情况有案例么? curl、file_get_contents这些我纯粹好奇,有详细的测试再贴上来
加载更多回复(3)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧