本文目录导读:

- 方法一:通过 Apache 配置(推荐,性能最好)
- 方法二:通过 Nginx 配置(推荐,性能最好)
- 方法三:通过 PHP 代码实现(当无法控制服务器时)
- 方法四:使用 PHP-FPM 配置(FastCGI 压缩)
- 检测是否生效
- 推荐方案排序
- 注意事项
在 PHP 项目中配置站点压缩传输,主要是通过 Gzip 或 Deflate 算法来压缩输出内容(如 HTML、CSS、JS),以减少网络传输数据量,提升页面加载速度。
核心方法有三种:通过 Apache 服务器配置、通过 Nginx 服务器配置、通过 PHP 代码自身实现。
通过 Apache 配置(推荐,性能最好)
如果你的项目运行在 Apache 服务器上,推荐使用 mod_deflate 或 mod_gzip 模块。
确认模块已启用
在终端或服务器管理面板中执行:
sudo a2enmod deflate sudo systemctl restart apache2
配置 .htaccess 或 httpd.conf
在项目根目录的 .htaccess 文件中加入:
<IfModule mod_deflate.c>
# 压缩 HTML、CSS、JS、XML 等文本文件
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json application/xml
# 排除某些浏览器(旧版 IE)
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>
优点:配置简单、性能高、无需修改 PHP 代码。
通过 Nginx 配置(推荐,性能最好)
如果使用 Nginx,修改站点配置文件(通常是 /etc/nginx/sites-available/your-site)。
配置示例
server {
# ... 其他配置
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6; # 压缩级别 1-9,推荐 6(平衡性能与压缩率)
gzip_min_length 256; # 小于 256 字节的文件不压缩
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
image/svg+xml
font/ttf
font/otf
image/x-icon;
# 禁用对 IE6 的压缩(可选)
gzip_disable "msie6";
}
配置后重启 Nginx:
sudo nginx -t # 测试配置 sudo systemctl reload nginx
通过 PHP 代码实现(当无法控制服务器时)
如果你没有服务器配置权限,可以在 PHP 代码中拦截输出,用 ob_gzhandler 进行压缩。
全站压缩(入口文件)
在 index.php 或公共入口文件的最顶部添加:
<?php
// 检查浏览器是否支持 gzip
if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) {
ob_start('ob_gzhandler');
} else {
ob_start();
}
// 后续正常输出...
在框架中使用
- Laravel:中间件方式
- ThinkPHP:可在
public/index.php顶部加 - 原生项目:放在
header.php之前
<?php
// 更完整的写法
if (extension_loaded('zlib') && !ob_start('ob_gzhandler')) {
ob_start();
}
缺点:
- 性能不如服务器模块
- 会消耗更多 PHP 进程 CPU 资源
- 如果服务器已经开启 Gzip,会产生重复编码(需检测)
使用 PHP-FPM 配置(FastCGI 压缩)
如果你的 PHP-FPM 配置了 apache_mod 或 Nginx 反向代理,可以结合 brotli 或 gzip 在反向代理层完成,不过一般直接使用 Nginx 或 Apache 模块即可。
检测是否生效
配置完成后,可以用以下方式验证:
-
浏览器开发者工具:
- 打开 Chrome DevTools → Network → 选择一个请求
- 查看 Response Headers,如果出现
Content-Encoding: gzip就说明生效了
-
在线工具:
- 使用 Check Gzip Compression 输入项目 URL
-
curl 命令:
curl -H "Accept-Encoding: gzip" -I https://your-site.com/ # 返回头中应有 Content-Encoding: gzip
推荐方案排序
| 场景 | 推荐配置 |
|---|---|
| 共享主机(有 Apache 权限) | .htaccess 配置 mod_deflate |
| 自建服务器(Nginx) | Nginx 配置 gzip on |
| 没有服务器控制权 | PHP ob_gzhandler |
| 流量大、追求极致性能 | Nginx + Brotli(需编译安装 brotli 模块) |
注意事项
- 不要重复压缩:如果服务器已经开启 Gzip,PHP 代码中再开
ob_gzhandler会导致乱码或性能浪费。 - 图片文件:JPEG/PNG 已经是压缩格式,一般不需要再 Gzip(但 SVG 需要)。
- API 接口:同样可以压缩 JSON/XML 响应,建议对大于 1KB 的响应启用压缩。
- 老式浏览器:IE6 以下不支持 Gzip,需要做兼容处理(上述 Apache/Nginx 配置已有处理)。
如果还需要配置 Brotli 压缩(比 Gzip 压缩率高约 20%),也可以参考 Nginx 的 brotli on; 配置,需要我提供 Brotli 的安装和配置步骤吗?