http_compression 必须通过 $server->set() 设置布尔值或字符串(如'gzip'、'br'),v4.1.0+支持,旧版静默忽略;压缩级别由独立配置 http_compression_level(1–9,默认1)控制,br压缩受系统brotli库影响,write()分段响应会禁用自动压缩。

http_compression 配置项必须设在 server->set() 里
不是调用 gzip() 方法,也不是写在 PHP 的 response 对象上——http_compression 是 Swoole HTTP Server 的全局配置项,只接受布尔值或字符串(如 'gzip'、'br'),必须通过 $server->set() 设置。v4.1.0+ 才支持,低于此版本会静默忽略。
- 启用压缩:
$server->set(['http_compression' => true]); - 禁用压缩:
$server->set(['http_compression' => false]); - 强制指定算法(不推荐):
$server->set(['http_compression' => 'br']);,但客户端不支持时会退化为不压缩 - 别和旧版
gzip()混用:同时存在会导致响应头冲突或压缩失效
压缩级别由 http_compression_level 控制,非 gzip() 的 $level 参数
http_compression_level 是独立配置项,范围 1–9,默认为 1。它作用于所有启用的压缩算法(gzip/deflate/br),不是某个方法的参数。设太高(比如 9)会让 CPU 在高并发下明显吃紧,实测 4–6 是多数业务的平衡点。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 正确写法:
$server->set(['http_compression_level' => 5]); - 错误写法:
$response->gzip(5)—— 这个方法在新版本已废弃,且与http_compression冲突 - 注意:br 压缩不完全遵循该级别,它有自己的内部策略,
http_compression_level对 br 影响有限
br 压缩需要系统有 libbrotlienc,否则自动降级
如果配置了 http_compression => true 且客户端支持 br,但系统缺少 brotli 编译依赖,Swoole 启动时不会报错,而是静默跳过 br,回退到 gzip 或不压缩。可通过 php --ri swoole 查看输出中是否有 brotli => enabled。
- Debian/Ubuntu 安装:
sudo apt-get install libbrotli-dev - CentOS/RHEL:
sudo yum install brotli-devel(EPEL 源需提前启用) - 编译 Swoole 时必须带
--enable-brotli,否则即使系统有库也无效 - 验证是否生效:用 curl 请求,看响应头是否含
content-encoding: br
write() 分段响应会强制关闭压缩
只要用了 $response->write()(比如流式输出大文件、SSE 场景),Swoole 就无法预知完整响应体大小,http_compression 会自动失效,响应头也不会加 Content-Encoding。这不是 bug,是设计限制。
- 想压缩又需分段?只能自己用
gzencode()或zlib_encode()在 PHP 层手动压缩,再write()压缩后的二进制 -
$response->end()全量发送才走自动压缩流程 - 图片等已压缩资源(jpg/png)仍会被尝试压缩,浪费 CPU,建议前置判断 MIME 类型并跳过










