php输出压缩未开启会导致html/json/css/js明文传输,体积增大2–4倍;应启用zlib.output_compression或ob_gzhandler,禁用nginx gzip重复压缩,并避免php输出静态资源。

PHP 输出压缩没开,带宽白白多跑 3 倍
很多 PHP 项目默认关着 zlib.output_compression,浏览器请求 HTML/JSON/CSS/JS 全是明文传,尤其 API 返回大数组、日志 dump、渲染页含大量重复标签时,体积动辄翻 2–4 倍。这不是“能用就行”的问题,是实打实把带宽压在了最不值得压的地方。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 确认是否启用:
ini_get('zlib.output_compression')返回''(空字符串)或'0'就代表没开;返回'1'或数字表示已启用 - 线上环境优先改
php.ini:设zlib.output_compression = On,或指定压缩级别如zlib.output_compression = 6(1–9,6 是平衡点) - 不能改配置?在脚本开头加
ob_start('ob_gzhandler'),但注意:必须在任何输出(包括空格、BOM、echo)之前调用,否则报Cannot modify header information - 别和 Nginx 的
gzip on叠加用——PHP 层开了,Nginx 层就该关掉gzip,否则可能双压出错或长度头不匹配
图片/静态资源还在 PHP 脚本里读取和输出
用 readfile() 或 file_get_contents() + header() 输出图片、PDF、ZIP,看着灵活,实则绕过所有 CDN、浏览器缓存、Nginx 静态服务优化。每次请求都走 PHP-FPM、读磁盘、拼响应头,带宽没省,CPU 和 I/O 先扛不住。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 把资源放真实路径下,比如
/static/uploads/photo.jpg,直接用 URL 访问,让 Web 服务器原生处理 - 必须动态控制访问权限?用
X-Accel-Redirect(Nginx)或X-Sendfile(Apache),PHP 只校验权限,返回一个内部重定向头,真正文件传输由 Web 服务器完成 - 避免在 PHP 中用
imagejpeg()实时生成缩略图并输出——提前生成好存在磁盘,或交给专门的图片服务(如 imgproxy)
API 接口返回冗余字段,JSON 体积失控
查数据库 SELECT * 然后 json_encode($row) 直接吐给前端,是带宽杀手。一个用户表查出来带 password_hash、remember_token、created_at(毫秒级时间戳)、updated_at(同上)、deleted_at(null 字段仍占键名),JSON 多出 30%+ 无用字符。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 显式构造返回数组,只塞前端真需要的字段:
['id' => $u->id, 'name' => $u->name, 'avatar' => $u->avatar] - 用
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES减少转义:比如"\u4f60\u597d"→"你好","https:\/\/api.example.com"→"https://api.example.com" - 对列表接口,加
?fields=id,name,avatar参数做字段投影,后端用array_intersect_key()过滤,比全量序列化再删键更轻量 - 别用
var_dump()或print_r()调试输出混在 API 响应里——上线前务必 grep 清理
长轮询、SSE、WebSocket 没关心跳或没压缩
用 while(true) + sleep(1) 做长轮询,或者 SSE 推送日志流,若每秒发一次空心跳(如 data: \n\n),看似小,但千人并发就是每秒上千次 HTTP 响应头 + 换行符,带宽和连接数一起吃紧。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- SSE 心跳间隔拉到 15–30 秒,用注释行
: keepalive\n,不触发事件,且不增加响应体大小 - WebSocket 启用
permessage-deflate扩展(PHP-Websocket 库如 Ratchet 支持),服务端和客户端协商开启帧级压缩,对文本消息效果明显 - 长轮询接口必须加
Cache-Control: no-cache,但别用Expires: 0或负值——某些代理会因此拒绝缓存,反而加重源站压力
带宽不是靠“省一点是一点”抠出来的,关键在分清哪些数据非传不可、哪些该由边缘处理、哪些根本不该从 PHP 出来。最容易被忽略的是:Nginx gzip 和 PHP zlib 同时开,或静态资源硬塞进 PHP 输出流——这两类操作一出现,其他优化基本白做。











