无法使用PHP cURL获取内容编码

7cjasjjr  于 2023-02-18  发布在  PHP
关注(0)|答案(1)|浏览(148)

我正在使用cURL和PHP来获取内容类型和内容编码。我成功地获取了内容类型,但内容编码值为空。

function get_content_type_curl($url_content_type) {
    
    $agent_content_type = $_SERVER['HTTP_USER_AGENT'];
    $ch_content_type = curl_init();

    curl_setopt($ch_content_type, CURLOPT_URL, $url_content_type);
    curl_setopt($ch_content_type, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch_content_type, CURLOPT_HEADER, 0);
    curl_setopt($ch_content_type, CURLOPT_NOBODY, 1);
    curl_setopt($ch_content_type, CURLOPT_USERAGENT, $agent_content_type);
    curl_setopt($ch_content_type, CURLOPT_FOLLOWLOCATION, 1);

    curl_exec($ch_content_type);
    $content_type = curl_getinfo($ch_content_type, CURLINFO_CONTENT_TYPE);
    $content_encoding = defined('CURLINFO_CONTENT_ENCODING') ? curl_getinfo($ch_content_type, CURLINFO_CONTENT_ENCODING) : '';
    //$content_encoding = curl_getinfo($ch_content_type, CURLINFO_CONTENT_ENCODING);

    curl_close($ch_content_type);

    return array("content_type" => $content_type, "content_encoding" => $content_encoding);
}

$result = get_content_type_curl("https://affiliatefix.com/sitemap-1.xml");

echo $result["content_type"] . "\n";
if (!empty($result["content_encoding"])) {
    echo $result["content_encoding"] . "\n";
}

/**if (strpos($result["content_encoding"], "gzip") !== false) {
    echo $result["content_encoding"] . "\n";
} else {
    echo "No encoding".$result["content_encoding"] . "\n";
}**/

https://affiliatefix.com/sitemap-1.xml的输出:
内容类型:application/xml; charset=utf-8//成功获取
内容编码:gzip//我越来越空虚了。

ni65a41a

ni65a41a1#

不知道你是怎么找到这个常量CURLINFO_CONTENT_ENCODING的,它没有出现在php文档或cURL文档中,要得到响应头,你需要注册一个回调函数,如下所示:

curl_setopt($ch_content_type, CURLOPT_HEADERFUNCTION, function($ch, $header){
    if(stripos($header, 'content-encoding') === 0){
        #parse content_encoding here.
    }
    return strlen($header);
});

另一种方法是设置CURLOPT_HEADER,然后手动截断头。当然,由于不需要主体,返回的字符串是整个头:

curl_setopt($ch_content_type, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch_content_type, CURLOPT_HEADER, 1);
curl_setopt($ch_content_type, CURLOPT_NOBODY, 1);
$header_and_body = curl_exec($ch_content_type);

$header_size = curl_getinfo($ch_content_type, CURLINFO_HEADER_SIZE);
$header = substr($header_and_body, 0, $header_size);

相关问题