php 8.1 不自带 brotli 扩展,需手动编译安装 ext-brotli,依赖系统 brotli 开发库,并确保源码含 ext/brotli 目录且编译时启用 --with-brotli-dir;启用需配置 brotli.output_compression = on 并验证函数可用。

PHP 8.1是否自带brotli扩展?
不带。PHP官方源码从 8.0 开始才提供 brotli 扩展的 stub(即编译入口),但默认不启用,也不随发行版预装。PHP 8.1 仍需手动编译安装 ext-brotli,且依赖系统级 Brotli 库(libbrotli-dev 或 brotli-devel)。
编译安装ext-brotli前必须确认的三件事
缺一不可,否则编译失败或运行时报 undefined function brotli_compress():
- 已安装系统 Brotli 开发库:
apt install libbrotli-dev(Debian/Ubuntu)或yum install brotli-devel(CentOS/RHEL) - PHP 源码目录中存在
ext/brotli子目录(若用宝塔或一键包安装的 PHP,通常缺失;建议从 php.net 下载对应版本源码解压后补全) - PHP 编译时未禁用
--disable-brotli(检查php -i | grep Configure输出中是否含该参数)
如何验证brotli扩展已正确加载
安装完成后不能只看 php -m | grep brotli,还要确认函数可用性和配置生效:
- 执行
php -r "echo extension_loaded('brotli') ? 'loaded' : 'failed';",输出loaded才算扩展注册成功 - 检查
php.ini中是否启用了extension=brotli.so(注意路径是否正确,宝塔用户常见错配为brotli.so在/www/server/php/81/lib/php/extensions/no-debug-non-zts-20210902/下) - 调用
brotli_compress("test")测试函数是否存在——若报Call to undefined function,说明扩展虽加载但函数未导出,大概率是 PHP 编译时漏了--with-brotli-dir
PHP层启用Brotli压缩输出的两种方式
注意:这和 Nginx 的 brotli on 完全无关,是纯 PHP 输出缓冲层的压缩,仅对 echo/print 类响应生效:
- 在
php.ini中设brotli.output_compression = On(PHP 8.1+ 支持该 INI 指令) - 运行时用
ini_set('brotli.output_compression', '1'),但必须在任何输出之前调用(包括空格、BOM) - 不推荐混用
zlib.output_compression和brotli.output_compression,PHP 不支持双层输出压缩协商,会以先启用者为准 - 浏览器能否解压取决于响应头
Content-Encoding: br,而该头由 PHP 自动添加——前提是客户端请求头含Accept-Encoding: br,否则 PHP 会退回到无压缩
真正容易被忽略的是:PHP 的 brotli.output_compression 仅压缩「PHP 脚本生成的内容」,静态文件(如 /js/app.js)仍走 Nginx 原生压缩逻辑。如果网站混合使用静态资源与动态接口,必须同时配置 Nginx 的 brotli 和 PHP 的 brotli.output_compression,否则压缩策略会割裂。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











