FrankenPHP 1.5 默认启用gzip压缩,但需确保zlib扩展已启用(php -m | grep zlib验证)、Caddyfile中配置encode gzip、响应头含Content-Encoding: gzip且Vary: Accept-Encoding,同时避免响应体过小、缺少Accept-Encoding头或输出缓冲被提前终止。

FrankenPHP 1.5 默认已启用 gzip 压缩,无需额外安装插件或编写代码,但需确认配置未禁用且环境满足基本条件。
确认 PHP zlib 扩展已启用
gzip 压缩依赖 PHP 的 zlib 扩展。若该扩展未开启,FrankenPHP 无法执行压缩。
- 运行
php -m | grep zlib,输出含zlib表示已启用 - 如无输出,在
php.ini中取消注释extension=zlib(或extension=php_zlib.dllon Windows),重启 FrankenPHP 进程 - 可通过
phpinfo()页面搜索 “zlib” 验证
检查 Caddyfile 中未禁用 encode 指令
FrankenPHP 内置 Caddy 服务器,其压缩行为由 encode 指令控制。默认仅启用 gzip,但若显式关闭或覆盖,压缩将失效。
- 打开你的
Caddyfile,查找是否有encode相关行 - 确保存在
encode gzip(推荐放在reverse_proxy或路由块内) - 避免写成
encode none或遗漏gzip;若写了encode br gzip但未安装 Brotli 插件,gzip 仍可 fallback 工作
验证响应头是否生效
压缩是否起作用,最终看 HTTP 响应头。注意:FrankenPHP 只对 PHP 动态响应压缩,静态文件(.css/.js)需额外配置或交由 Caddy 处理。
立即学习“PHP免费学习笔记(深入)”;
- 用 curl 测试:
curl -H "Accept-Encoding: gzip" -I http://localhost/your-route - 成功时响应头应含
Content-Encoding: gzip和Vary: Accept-Encoding - 若缺失
Vary,CDN 或代理可能缓存未压缩版本;若返回 406,说明服务端不支持客户端声明的编码
常见不生效原因
即使配置正确,也可能因以下情况导致 gzip 不触发:
- 响应体太小(默认阈值约 200 字节),FrankenPHP/Caddy 可能跳过压缩
- 请求头未带
Accept-Encoding: gzip(浏览器通常自带,但 curl 默认不发) - 使用了
php -S启动方式——FrankenPHP 与此无关,php -S本身不支持任何压缩 - PHP 脚本中提前调用了
ob_end_flush()或关闭了输出缓冲,干扰了 Caddy 的压缩流程



















