您当前位于: 首页 » 我爱PHP, 网络通信协议 » php让服务器不返回chunked

php让服务器不返回chunked10/13/2011

chunked是http头部一个很特殊的东西,现代浏览器都支持解析Transfer-Encoding:chunked,chunked能更快的让页面呈现出来,因为它能分段下载,浏览器分段解析,对于大页面,这显然提高了可用性,facebook利用这个特性实现了牛逼的big pipe,那实在是将chunked发挥到淋漓尽致的应用了。

nginx好像默认就支持chunked,我还没有找到选项关闭,现在我想要获取一个服务器上的数据,该服务器头部默认包含了chunked,这个特性导致用php处理起来显得有些不爽,而且即使他分段提供,我还是需要把它全部读完才开始处理,虽然php可以很方便的http_chunked_decode,但我这人骨子里就是有点喜欢反人类,让服务器不要返回chunked的数据不就可以了吗?后来。。。。。后来还真让我想到了,chunked是http 1.1才有的东西,所以如果告诉服务器,我只能解析1.0,应该就解决问题了,请看烂代码示例:

<?php
$host = 'www.qq.com';
set_time_limit(10);
$st=array_sum(explode(' ',microtime()));
$ip=gethostbyname($host);
$fp=@fsockopen($ip,80,$errno,$errst,5);
if( !$fp ){
	die('挂了.');
}
$header = "GET / HTTP/1.0\r\n";
$header .= "Host: {$host}\r\n";
$header .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1\r\n";
$header .= "Accept: text/html\r\n";
$header .= "Connection: keep-alive\r\n\r\n";
fwrite($fp, $header);
$c=fread($fp,1024);
var_dump($c);
$et=array_sum(explode(' ',microtime()));
fclose($fp);
var_dump($et-$st);
?>

可以尝试把代码中的1.0改成1.1试试,body部分总是会多出那么几个数字,烦人。这里仅拿QQ做个示例,并非采集之用,给我留言乱猜的同学就此谢过了。

| 2条评论 标签:  

2条评论
  1. | 蜻蜓点水说道:

    […] 原文链接:http://www.zendstudio.net/archives/set-server-headers-have-no-chunked-by-php/ […]

  2. liaowq说道:

    chunked, 对http进行降级,就不会用chunked了。。。这个在<> 这本书有介绍了。。

发表评论