PHP CURL无法解析Brotli编码返回乱码,寻求解决方案
解决PHP CURL请求Brotli编码响应乱码问题
返回的乱码内容是因为服务器返回了Brotli压缩格式的响应,而你的CURL配置没有对Brotli编码进行解码处理。以下是几种可行的解决方案:
方案一:使用PHP官方Brotli扩展解码
首先确认你的PHP环境是否安装了ext-brotli扩展:
- 命令行执行
php -m | grep brotli查看是否存在 - 或者在代码中用
var_dump(extension_loaded('brotli'));验证
如果已安装,修改你的CURL代码,添加编码识别和解码逻辑:
$curl = curl_init(); $contentEncoding = ''; curl_setopt_array($curl, [ CURLOPT_URL => "https://songstats.p.rapidapi.com/artists/info?spotify_artist_id=2h93pZq0e7k5yf4dywlkpM&songstats_artist_id=vxk62ige", CURLOPT_RETURNTRANSFER => true, CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => [ "X-RapidAPI-Host: songstats.p.rapidapi.com", "X-RapidAPI-Key: MY_API_KEY", "Accept-Encoding: br, gzip, deflate" // 声明接受Brotli、gzip等编码 ], // 捕获响应头中的Content-Encoding字段 CURLOPT_HEADERFUNCTION => function($curl, $header) use (&$contentEncoding) { $len = strlen($header); $header = trim($header); if (stripos($header, 'content-encoding:') === 0) { $contentEncoding = trim(str_ireplace('content-encoding:', '', $header)); } return $len; } ]); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { // 判断是否为Brotli编码,执行解码 if ($contentEncoding === 'br' && function_exists('brotli_decode')) { $response = brotli_decode($response); } echo $response; } exit;
方案二:使用第三方Brotli解码库(无扩展时)
如果无法安装官方扩展,可以通过Composer引入第三方解码库:
- 安装依赖:
composer require voku/brotli
- 修改代码中的解码逻辑:
// 替换方案一中的解码部分 if ($contentEncoding === 'br') { require_once 'vendor/autoload.php'; $response = \voku\helper\Brotli::decode($response); }
补充说明
- 你之前尝试添加
gzip到Accept-Encoding无效,大概率是服务器强制返回Brotli编码,因此必须主动处理解码,而不是依赖服务器返回其他编码。 - 确保
CURLOPT_RETURNTRANSFER设置为true,否则CURL会直接输出原始压缩内容,无法后续处理。
内容的提问来源于stack exchange,提问作者Codeigniter
相关产品推荐
相关产品推荐

