php获取网页的内容file get,php 的file_get_contents函数获取网页内容不全的问题。

$a = file_get_contents('http://www.giabbs.com/thread-756955-1-1.html');

var_dump($a);

file_put_contents('a.txt', $a);

代码如上面。运行代码就发现,内容只获取到一半。在中间断掉了。这种情况一般是转码的情况,有些特殊字符无法转换,然后断掉的。可是为啥用这个函数获取原始内容也这样,真心想不通啊。

回复内容:

$a = file_get_contents('http://www.giabbs.com/thread-756955-1-1.html');

var_dump($a);

file_put_contents('a.txt', $a);

代码如上面。运行代码就发现,内容只获取到一半。在中间断掉了。这种情况一般是转码的情况,有些特殊字符无法转换,然后断掉的。可是为啥用这个函数获取原始内容也这样,真心想不通啊。

问题是这样的.

我们先看一下 file_get_contents 在获取网页时发送的HTTP请求.

GET /thread-756955-1-1.html HTTP/1.0

Host: www.giabbs.com

bVlQ2U

根据HTTP协议, file_get_contents 做为客户端在请求的时候,没有告诉服务器它支持 gzip 解压缩.

所以服务器在响应的时候, 内容也不会使用 gzip进行压缩, 而是直接输出内容, 但这个时候, 很明显服务器输出的内容就是少了一部分, 而且服务器也没有告诉客户端它输出的内容的长度是多少(没有Content-Length).

bVlQ24

HTTP/1.1 200 OK

Server: Tengine/1.5.1

Date: Fri, 22 May 2015 06:29:39 GMT

Content-Type: text/html; charset=gbk

Connection: close

Vary: Accept-Encoding

Set-Cookie: JKNS_6e29_saltkey=oA4y44By; expires=Sun, 21-Jun-2015 06:29:39 GMT; path=/; domain=.giabbs.com; httponly

Set-Cookie: JKNS_6e29_lastvisit=1432272579; expires=Sun, 21-Jun-2015 06:29:39 GMT; path=/; domain=.giabbs.com

Set-Cookie: JKNS_6e29_lastact=1432276179%09forum.php%09viewthread; expires=Sat, 23-May-2015 06:29:39 GMT; path=/; domain=.giabbs.com

Set-Cookie: JKNS_6e29_stats_qc_reg=deleted; expires=Thu, 22-May-2014 06:29:38 GMT; path=/; domain=.giabbs.com

Set-Cookie: JKNS_6e29_cloudstatpost=deleted; expires=Thu, 22-May-2014 06:29:38 GMT; path=/; domain=.giabbs.com

Set-Cookie: JKNS_6e29_viewid=tid_756955; path=/; domain=.giabbs.com

Thanks: Welcome to our website!

而当使用真正的浏览器去请求的时候(目前绝大部分浏览器是支持解gzip压缩的)是有告诉服务器,我可以解gzip压缩,

所以服务器就给了浏览器经过 gzip 压缩后的内容, 而这个时候, 给的数据是正确的.

有图有真相:

HTTP请求:

bVlQ3i

HTTP响应:

bVlQ3j

那么如何解决这个问题呢?

file_get_contents在请求URL时,也是可以设定HTTP请求头的,所以...

array (

'method' => 'GET',

'header'=> "Accept-Encoding: gzip, deflate, sdch\r\n"//在请求的时候告诉服务器支持解Gzip压缩的内容

)

);

$context = stream_context_create($opts);

$a = file_get_contents('compress.zlib://http://www.giabbs.com/thread-756955-1-1.html', false, $context);//在读取内容的时候使用 `compress.zlib` 对内容进行解压缩.

file_put_contents('aaaa.txt', $a);

var_dump(substr($a, -100));

运行结果:

bVlQ3M

结论是 www.giabbs.com 这个网站的服务器在客户端不支持解gzip压缩的时候, 输出的内容不完整.

我以前遇到过内容只有一半的情况,但我是在正常访问网页的时候,

通过几次排查发现,这都是由于被访问页面的编码问题导致的,就算是浏览器也只加载了一半内容

你curl这个网页 也会断

相关标签:php

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值