$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.0Host: www.giabbs.com
根据HTTP协议, file_get_contents 做为客户端在请求的时候,没有告诉服务器它支持 gzip 解压缩.
所以服务器在响应的时候, 内容也不会使用 gzip进行压缩, 而是直接输出内容, 但这个时候, 很明显服务器输出的内容就是少了一部分, 而且服务器也没有告诉客户端它输出的内容的长度是多少(没有Content-length).
HTTP/1.1 200 OKServer: Tengine/1.5.1Date: Fri, 22 May 2015 06:29:39 GMTContent-Type: text/html; charset=gbkConnection: closeVary: Accept-EncodingSet-Cookie: JKNS_6e29_saltkey=oA4y44By; expires=Sun, 21-Jun-2015 06:29:39 GMT; path=/; domain=.giabbs.com; httponlySet-Cookie: JKNS_6e29_lastvisit=1432272579; expires=Sun, 21-Jun-2015 06:29:39 GMT; path=/; domain=.giabbs.comSet-Cookie: JKNS_6e29_lastact=1432276179%09forum.php%09viewthread; expires=Sat, 23-May-2015 06:29:39 GMT; path=/; domain=.giabbs.comSet-Cookie: JKNS_6e29_stats_qc_reg=deleted; expires=Thu, 22-May-2014 06:29:38 GMT; path=/; domain=.giabbs.comSet-Cookie: JKNS_6e29_cloudstatpost=deleted; expires=Thu, 22-May-2014 06:29:38 GMT; path=/; domain=.giabbs.comSet-Cookie: JKNS_6e29_viewid=tid_756955; path=/; domain=.giabbs.comThanks: Welcome to our website!
而当使用真正的浏览器去请求的时候(目前绝大部分浏览器是支持解gzip压缩的)是有告诉服务器,我可以解gzip压缩,
所以服务器就给了浏览器经过 gzip 压缩后的内容, 而这个时候, 给的数据是正确的.
有图有真相:
HTTP请求:
HTTP响应:
那么如何解决这个问题呢?
file_get_contents在请求URL时,也是可以设定HTTP请求头的,所以...
<?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));
运行结果:
结论是 www.giabbs.com 这个网站的服务器在客户端不支持解gzip压缩的时候, 输出的内容不完整.
立即学习“PHP免费学习笔记(深入)”;
我以前遇到过内容只有一半的情况,但我是在正常访问网页的时候,
通过几次排查发现,这都是由于被访问页面的编码问题导致的,就算是浏览器也只加载了一半内容
你curl这个网页 也会断