首页 > php 的file_get_contents函数获取网页内容不全的问题。

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);

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


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

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


你curl这个网页 也会断


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

GET /thread-756955-1-1.html HTTP/1.0
Host: www.giabbs.com


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

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请求:

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压缩的时候, 输出的内容不完整.

【热门文章】
【热门文章】