PHP项目如何配置站点压缩传输?

wen PHP项目 23

本文目录导读:

PHP项目如何配置站点压缩传输?

  1. 方法一:通过 Apache 配置(推荐,性能最好)
  2. 方法二:通过 Nginx 配置(推荐,性能最好)
  3. 方法三:通过 PHP 代码实现(当无法控制服务器时)
  4. 方法四:使用 PHP-FPM 配置(FastCGI 压缩)
  5. 检测是否生效
  6. 推荐方案排序
  7. 注意事项

在 PHP 项目中配置站点压缩传输,主要是通过 GzipDeflate 算法来压缩输出内容(如 HTML、CSS、JS),以减少网络传输数据量,提升页面加载速度。

核心方法有三种:通过 Apache 服务器配置通过 Nginx 服务器配置通过 PHP 代码自身实现


通过 Apache 配置(推荐,性能最好)

如果你的项目运行在 Apache 服务器上,推荐使用 mod_deflatemod_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 反向代理,可以结合 brotligzip 在反向代理层完成,不过一般直接使用 Nginx 或 Apache 模块即可。


检测是否生效

配置完成后,可以用以下方式验证:

  1. 浏览器开发者工具

    • 打开 Chrome DevTools → Network → 选择一个请求
    • 查看 Response Headers,如果出现 Content-Encoding: gzip 就说明生效了
  2. 在线工具

  3. 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 的安装和配置步骤吗?

抱歉,评论功能暂时关闭!