chrome network 中看不到 content-encoding: gzip 的主要原因是 nginx 未对 php 动态响应(如 thinkphp 输出的 html/json)启用 gzip,需在 location ~ .php$ 块中显式配置 gzip_on、gzip_types 包含 text/html 和 application/json,并关闭 php 的 zlib.output_compression。

为什么 gzip 开了但 Chrome Network 里看不到 Content-Encoding: gzip
常见原因是 Nginx 没有对 PHP 动态响应启用压缩,只压了静态资源(CSS/JS)。ThinkPHP 输出的 HTML 和 JSON 默认走 fastcgi 协议,而 Nginx 的 gzip 模块默认不处理 fastcgi 返回的内容。
必须显式开启:gzip_vary on、gzip_types 补上 text/html application/json,且确保 gzip 在 location ~ \.php$ 块内生效或全局启用。
- 检查 Nginx 配置中是否在
location ~ \.php$内重复写了gzip off—— 这会覆盖全局设置 -
gzip_min_length别设太高(如 1024),ThinkPHP 的首页 HTML 可能不到 1KB,设成1更稳妥 - 确认 PHP-FPM 没开
zlib.output_compression,它和 Nginxgzip冲突,会导致响应头混乱甚至 502
ThinkPHP 自身输出未压缩?别动框架,交由 Nginx 处理
有人试图在 app/common.php 里调用 ob_gzhandler 或手动 gzencode,这不仅多余,还会破坏 Nginx 的缓存逻辑和 Vary: Accept-Encoding 头,导致 CDN 或代理缓存错乱。
ThinkPHP 5.1+ 默认关闭输出缓冲压缩,也不推荐开启。它的角色是生成原始响应体,压缩该由 Web 服务器层统一收口。
- 删掉所有
ini_set('zlib.output_compression', 'On')或ob_start('ob_gzhandler')类代码 - 检查
php.ini中zlib.output_compression = Off(线上环境必须关) - 如果用了 Swoole,注意它自带
gzip开关(http_compression),和 Nginx 配置要互斥
Nginx 配置里 gzip_types 漏了 application/json 就等于没压接口
ThinkPHP 的 API 接口返回大量 application/json,但 Nginx 默认 gzip_types 只含 text/plain text/css 等,JSON 不在其中,导致接口响应体积原样传输。
补全类型后,还需注意 MIME 类型是否真被正确识别:ThinkPHP 用 header('Content-Type: application/json; charset=utf-8') 是 OK 的,但若手动 echo 且没设 header,Nginx 可能按 text/plain 处理,那就压不了。
- 在 Nginx
http块中加:gzip_types text/plain text/css text/javascript application/javascript application/json application/xml; - 用
curl -I -H "Accept-Encoding: gzip" https://yoursite.com/api/user验证响应头是否含Content-Encoding: gzip - 避免写
gzip_types *—— Nginx 不支持通配符,会直接报配置错误
开了 gzip 但首屏时间没变?可能是 TTFB 卡在 PHP 层
Gzip 只减少传输体积,不加速 PHP 执行、DB 查询或模板渲染。如果 Lighthouse 显示“Reduce initial server response time”,说明瓶颈在后端,压再小也白搭。
先用 ab 或 curl -w "@format.txt" 测真实 TTFB,再对比 ThinkPHP 日志里的 sql 和 trace 时间。常见拖慢点:未走 Redis 缓存的配置加载、每次请求都重读 YAML、vendor/autoload.php 加载慢(可考虑 OPcache + APCu)。
- 开启 PHP OPcache(
opcache.enable=1),并确认 ThinkPHP 的runtime目录可写,让模板编译缓存生效 - 禁用开发环境才需要的调试中间件(如
Debugbar、think-trace),它们显著增加 TTFB - 不要为了“看起来快”强行压缩小文件(如
favicon.ico),反而增加 CPU 开销
gzip 能省带宽,不能救慢查询。真正卡住首屏的,往往是一条没加索引的 where status=0。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










