<code>$a = file_get_contents('http://www.giabbs.com/thread-756955-1-1.html'); var_dump($a); file_put_contents('a.txt', $a); </code>
代码如上面。运行代码就发现,内容只获取到一半。在中间断掉了。这种情况一般是转码的情况,有些特殊字符无法转换,然后断掉的。可是为啥用这个函数获取原始内容也这样,真心想不通啊。
<code>$a = file_get_contents('http://www.giabbs.com/thread-756955-1-1.html'); var_dump($a); file_put_contents('a.txt', $a); </code>
代码如上面。运行代码就发现,内容只获取到一半。在中间断掉了。这种情况一般是转码的情况,有些特殊字符无法转换,然后断掉的。可是为啥用这个函数获取原始内容也这样,真心想不通啊。
问题是这样的.
我们先看一下 file_get_contents
在获取网页时发送的HTTP
请求.
<code>GET /thread-756955-1-1.html HTTP/1.0 Host: www.giabbs.com </code>
根据HTTP
协议, file_get_contents
做为客户端在请求的时候,没有告诉服务器它支持 gzip
解压缩.
所以服务器在响应的时候, 内容也不会使用 gzip
进行压缩, 而是直接输出内容, 但这个时候, 很明显服务器输出的内容就是少了一部分, 而且服务器也没有告诉客户端它输出的内容的长度是多少(没有Content-Length
).
<code>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! </code>
而当使用真正的浏览器去请求的时候(目前绝大部分浏览器是支持解gzip
压缩的)是有告诉服务器,我可以解gzip
压缩,
所以服务器就给了浏览器经过 gzip
压缩后的内容, 而这个时候, 给的数据是正确的.
有图有真相:
HTTP请求:
HTTP响应:
那么如何解决这个问题呢?file_get_contents
在请求URL
时,也是可以设定HTTP请求头的,所以...
<code><?php $opts = array ( '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)); </code>
运行结果:
结论是 www.giabbs.com
这个网站的服务器在客户端不支持解gzip
压缩的时候, 输出的内容不完整.
我以前遇到过内容只有一半的情况,但我是在正常访问网页的时候,
通过几次排查发现,这都是由于被访问页面的编码问题导致的,就算是浏览器也只加载了一半内容
你curl这个网页 也会断