欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-04-24 08:29:16
...
$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

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

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请求:
php 的file_get_contents函数获取网页内容不全的问题。
HTTP响应:
php 的file_get_contents函数获取网页内容不全的问题。

那么如何解决这个问题呢?
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));

运行结果:
php 的file_get_contents函数获取网页内容不全的问题。

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

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

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

你curl这个网页 也会断

相关标签: php