编译swoole前必须安装libbrotlienc开发库并显式启用--with-brotli,否则http_compression设为true也无法启用br压缩;需通过php --ri swoole验证是否生效,并用curl直连端口确认content-encoding: br。

编译Swoole前必须安装libbrotlienc开发库
不装这个,http_compression设为true也压不出br,Nginx里配Brotli那套完全不适用——Swoole的br压缩是独立于Nginx的,靠自己链接libbrotlienc实现。
常见错误现象:configure: error: Package requirements (libbrotlienc >= 1.0) were not met 或编译后运行时提示 No package ‘libbrotlienc’ found。
- CentOS/RHEL系(含宝塔):
yum install -y brotli-devel - Ubuntu/Debian系:
apt-get install -y libbrotli-dev - 若系统源太旧(如Ubuntu 20.04默认只有brotli 1.0.7),需手动编译安装brotli:下载最新brotli release,
./configure && make && sudo make install,再确保pkg-config --modversion libbrotlienc能返回版本号
configure时要显式启用brotli支持
Swoole默认不强制检测brotli,即使系统已装库,./configure也可能跳过它。必须加参数让构建系统主动找。
执行./configure时务必包含:--enable-http-compression --with-brotli(注意不是--enable-brotli,后者无效)。
验证是否生效:
- 编译完成后运行
php --ri swoole | grep -i brotli,应输出类似Supports brotli: enabled - 若无此行,说明configure阶段没识别到库,回退检查
pkg-config libbrotlienc是否可用、头文件路径是否在PKG_CONFIG_PATH中
PHP代码中开启br压缩只需两行配置
和Nginx不同,Swoole不需要写一堆brotli_*指令;它根据客户端Accept-Encoding自动协商,br优先级高于gzip。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
关键点全在$server->set()里:
-
'http_compression' => true:必须开启,否则不走任何压缩流程 -
'http_compression_level' => 4:可选,1–9之间;设太高(如8+)会导致小响应体反而膨胀,文本类资源用4–6较稳 - 无需指定
types或min_length——Swoole内部已按MIME类型白名单过滤(text/*,application/json,application/javascript等默认覆盖)
示例片段:
$server = new Swoole\Http\Server('0.0.0.0', 9501);
$server->set([
'http_compression' => true,
'http_compression_level' => 5
]);
验证br是否实际生效不能只看header
浏览器开发者工具看到content-encoding: br只是表象,容易被Nginx反向代理层干扰(比如你忘了关Nginx的gzip,它可能把Swoole吐出的br又解压再gzip一次)。
真实验证方式:
- 绕过Nginx直连Swoole端口:
curl -H "Accept-Encoding: br" http://localhost:9501/test.js -v 2>&1 | grep "content-encoding",确认输出是br - 用
curl -I对比两次请求:Accept-Encoding: gzipvsbr,看响应头是否随请求头切换 - 若始终是
gzip,检查Swoole是否真加载了brotli(见上一条php --ri swoole)、以及客户端是否真的发了br(Chrome DevTools Network → Request Headers里确认)
最易忽略的一点:Swoole v4.8.13之前,http_compression对write()方法发送的内容无效(会自动关闭压缩),必须用end()或返回字符串。这点文档极少提,但线上踩坑率极高。










