获取 gzip 压缩时未定义的偏移警告


Undefined offset warning on getting gzip compression

我的代码最初适用于大多数网站,除了一些像(Facebook.com)。所以我插入了curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);之后它开始适用于所有网站,甚至得到了我需要的正确结果。

我的问题是我在这条线上Notice: Undefined offset: 1

list($k,$v)=explode(':',$header);

即使我得到了正确的结果。

注意到只有当我有CURLOPT_FOLLOWLOCATION行时,我才能得到那个notice,但没有那行,我无法获得一些网站 gzip 压缩信息

我的代码:

$ch = curl_init("http://facebook.com/");
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Accept-Encoding: gzip, deflate'));
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$buffer = curl_exec($ch);
$curl_info = curl_getinfo($ch);
curl_close($ch);
$header_size = $curl_info["header_size"];
$headers = substr($buffer, 0, $header_size);
$body = substr($buffer, $header_size);

function getEncoding(&$headers){
    $arr=explode("'r'n",trim($headers));
    array_shift($arr);
    foreach($arr as $header){
        list($k,$v)=explode(':',$header);
        if ('content-encoding'==strtolower($k)){
            return trim($v);
        }
    }
    return false;
}   
$encoding=getEncoding($headers);
if ($encoding) {
    echo "Using: ".$encoding;
}else{
    echo "None";
}

在调用 explode 之前检查标头是否包含 :

foreach($arr as $header){
    if (strstr($header, ':')) {
        list($k,$v)=explode(':',$header);
        if ('content-encoding'==strtolower($k)){
            return trim($v);
        }
    }
}

这将忽略任何不是 Name: value 格式的标头。如果响应以 100 Continue 开头,则可能会发生这种情况,因为稍后会将200 HTTP/1.1混合到其中。