phpEnv需手动配置Apache启用Gzip压缩:取消httpd.conf中deflate和headers模块注释,添加FilesMatch "\.php$"强制压缩PHP文件,禁用php.ini中zlib.output_compression以防双重压缩。

phpEnv 是 Windows 下的轻量级 PHP 开发环境套件,底层用的是 Apache + PHP(通常为线程安全版 TS),它不自带图形化 Gzip 开关,必须手动改配置文件。默认情况下,mod_deflate 模块是启用的,但压缩规则没配,所以 PHP 输出不会被压缩——这不是 PHP 侧的问题,而是 Apache 层没告诉它“对 .php 文件也压缩”。
确认 mod_deflate 已加载且可用
phpEnv 的 Apache 配置文件在 phpEnv\Apache\conf\httpd.conf。打开后搜索 deflate,确保这两行没被注释:
LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so
如果被 # 注释了,删掉开头的 #;保存后重启 phpEnv 的 Apache 服务(通过托盘图标或控制台)。
验证是否生效:访问 http://localhost,用 curl -I -H "Accept-Encoding: gzip" http://localhost 看响应头——若返回 500 或无 Vary: Accept-Encoding,说明模块没加载成功。
立即学习“PHP免费学习笔记(深入)”;
强制对 .php 文件启用 DEFLATE 压缩
AddOutputFilterByType DEFLATE text/html 这类写法靠 Content-Type 匹配,而 PHP 脚本常输出 text/html,但有时 header 被覆盖、或输出 JSON 时是 application/json,容易漏压。最稳的方式是绕过类型判断,直接按扩展名强制压缩:
- 在
httpd.conf底部(</IfModule>之后、最后一个</VirtualHost>之前)插入:
<IfModule mod_deflate.c>
<FilesMatch "\.php$">
SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>
注意:FilesMatch 里只写 \.php$,不要加 php5 或 php7;正则末尾的 $ 很关键,防止误匹配 script.php.bak 这类文件。
重启 Apache 后,所有 .php 请求都会走压缩流程,不管它实际输出什么 MIME 类型。
禁用 PHP 自身的 zlib.output_compression
phpEnv 默认的 php.ini(路径类似 phpEnv\php\php-8.x\php.ini)里,zlib.output_compression 通常是 Off,但得确认一下:
- 搜索
zlib.output_compression,确保值是Off(不是0或空字符串) - 如果看到
zlib.output_compression = On,改成Off并保存 - 同时检查
zlib.output_compression_level,设为6即可,但前提是压缩已关
PHP 和 Apache 双重压缩会导致 ERR_CONTENT_DECODING_FAILED,浏览器解不出数据。phpEnv 环境下,优先让 Apache 做这件事,PHP 侧保持干净。
验证压缩是否真起作用
别只看响应头有没有 Content-Encoding: gzip,还要看实际效果:
- 用 Chrome 打开开发者工具 → Network → 刷新页面 → 点一个
.php请求 → 查看 Response Headers 里的Content-Encoding和Vary - 对比 “Size” 列的
transferred(压缩后大小)和resource(原始大小),差值明显才说明压成功了 - 如果
transferred和resource几乎一样,可能是输出里有空格/UTF-8 BOM/提前 echo,或者SetOutputFilter没生效
最容易被忽略的是:phpEnv 的 Apache 默认不解析 .htaccess,所以别指望在网站目录里放 .htaccess 来配压缩——必须改 httpd.conf 主配置。



















