curl解决gzip和Transfer-Encoding:chunked的问题
客户的小偷站不能用了,今天有空看了一下
原来是对方站由http变https了,好在我有相关的代码,于是我换了上去
发现访问竟然是一片空白,按理说不可能啊
于是我想到了可能是证书验证,要先去掉验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//为了不要证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//为了不要证书
然后给长点时间
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5000);//超时时间
然后终于有反应了,出来的是乱码,气得我牙痒痒
我查了一下相关资料,说是要看被抓页面的header
我发现了两个比较奇怪的~
一个是用了gzip压缩,另外一个是Transfer-Encoding:chunked
Gzip比较好解决,一句话搞定
curl_setopt($ch, CURLOPT_ENCODING, ‘gzip’);
但是chunked让我头疼,网上资料说是分块传输什么的,相当于把源代码分几块传输
有人说把http版本弄成1.0
curl_setopt($ch, CURLOPT_HTTP_VERSION, ‘1.0’);//为了回避Transfer-Encoding:chunked
但我当时测试的时候,没有修改$ch,一直没成功,只好找其他出路,(所有事情结束后才发现原来是$ch没改对)
然后我找了第二个办法,从别人资料里找了unchunk和unchunkHttp11函数
测试的时候unchunkHttp11老是丢失前面的一大段字符,不懂为啥
后面只好用了unchunk,幸好成功了
function unchunk($result) { return preg_replace_callback( '/(?:(?:\r\n|\n)|^)([0-9A-F]+)(?:\r\n|\n){1,2}(.*?)'. '((?:\r\n|\n)(?:[0-9A-F]+(?:\r\n|\n))|$)/si', create_function( '$matches', 'return hexdec($matches[1]) == strlen($matches[2]) ? $matches[2] : $matches[0];' ), $result ); }
function unchunkHttp11($data) { $fp = 0; $outData = ""; while ($fp < strlen($data)) { $rawnum = substr($data, $fp, strpos(substr($data, $fp), "\r\n") + 2); $num = hexdec(trim($rawnum)); $fp += strlen($rawnum); $chunk = substr($data, $fp, $num); $outData .= $chunk; $fp += strlen($chunk); } return $outData; }