chunked编码问题 奇怪的是有时可以获取到结果,比如:int.(打招呼)喂;你好有时提示错误,比如:Warning: gzinflate(): data error in E:\CodeEdit\php\http\dict.php on line 380估计错误还是出现在chunked解码这块,这里的问题是返回的数据是先经过gzip压缩,然后通过chunked分块传输的,所以解码的过程就是反过来的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 if($this->is_chunked) { /* //读取chunk头部信息,获取chunk主体信息的长度 $chunk_size = (int)hexdec(trim(fgets($this->conn))); while(!feof($this->conn) && $chunk_size > 0) { //读取chunk头部指定长度的信息 $this->response_body .= fread( $this->conn, $chunk_size ); fseek($this->conn, 2, SEEK_CUR); $next_line = trim(fgets($this->conn)); if($next_line === '0') { echo $next_line;exit(); } else { $chunk_size = (int)hexdec($next_line); } } */ while(!feof($this->conn)) { $this->response_body .= fread($this->conn, 1024); } if(preg_match_all("#\r\n#i", $this->response_body, $match)) { $result=preg_split("#\r\n#i", $this->response_body, -1, PREG_SPLIT_NO_EMPTY ); // echo "<pre>"; // print_r($result); /* foreach($result as $v) { echo $v."<br /><hr />"; } echo "<hr />"; */ /* echo hexdec($result[0])."<br />"; echo mb_strlen($result[1])+mb_strlen($result[2])."<br />"; */ $len = count($result); $this->response_body=''; for($i=1; $i<$len-1; $i++) { $this->response_body .= $result[$i]; } //echo strlen($this->response_body); exit(); } else { die("匹配结束符失败"); } }基本思路,首先把头部改成connection:close,这样可以通过while(!feof($this->conn))一次性读取所有的数据然后因为chunk分块传输的头部和主体之间是用回车换行分隔的,所以直接用正则分割,得到一个数组包含数据长度和数据的数组,第一项表示所有数据的总长度(而不是每一个chunk分块的长度,这个貌似和chunk编码有点出入,也难怪按照chunk编码会失败,),最后一个数组项为0表示结束.反复测试,OK了 php 如何获取一个时间的毫秒时间类似js的Date.UTC函数 ecshop问题 数组分割循环读出 手机网站,css的标准问题 为什么这样得不到上传的文件名,请教 聊天室的问题 在Win2kprofessional+IIS+SQLServer上安装PHP 4.0,谁试过? 关于树的问题 TP SQL执行失败 怎么给volist遍历出来的div赋值不同的id? 请问php怎么制作商品检索系统,类似于淘宝的那种? 奇怪现象,未知问题.麻烦大家看看.数据库查询类query的
{
/* //读取chunk头部信息,获取chunk主体信息的长度
$chunk_size = (int)hexdec(trim(fgets($this->conn)));
while(!feof($this->conn) && $chunk_size > 0)
{
//读取chunk头部指定长度的信息
$this->response_body .= fread( $this->conn, $chunk_size );
fseek($this->conn, 2, SEEK_CUR);
$next_line = trim(fgets($this->conn));
if($next_line === '0')
{
echo $next_line;exit();
}
else
{
$chunk_size = (int)hexdec($next_line);
}
} */
while(!feof($this->conn))
{
$this->response_body .= fread($this->conn, 1024);
}
if(preg_match_all("#\r\n#i", $this->response_body, $match))
{
$result=preg_split("#\r\n#i", $this->response_body, -1, PREG_SPLIT_NO_EMPTY );
// echo "<pre>";
// print_r($result);
/* foreach($result as $v)
{
echo $v."<br /><hr />";
}
echo "<hr />"; */
/* echo hexdec($result[0])."<br />";
echo mb_strlen($result[1])+mb_strlen($result[2])."<br />"; */
$len = count($result);
$this->response_body='';
for($i=1; $i<$len-1; $i++)
{
$this->response_body .= $result[$i];
}
//echo strlen($this->response_body); exit();
}
else
{
die("匹配结束符失败");
}
}
基本思路,首先把头部改成connection:close,这样可以通过while(!feof($this->conn))一次性读取所有的数据然后因为chunk分块传输的头部和主体之间是用回车换行分隔的,所以直接用正则分割,得到一个数组包含数据长度和数据的数组,第一项表示所有数据的总长度(而不是每一个chunk分块的长度,这个貌似和chunk编码有点出入,也难怪按照chunk编码会失败,),最后一个数组项为0表示结束.反复测试,OK了