PHP 怎么PHP 响应压缩

wen PHP项目 2

本文目录导读:

PHP 怎么PHP 响应压缩

  1. 自动压缩(最简单推荐)
  2. 手动压缩(更灵活)
  3. 完整示例(手动控制)
  4. 压缩大文件/响应
  5. 验证是否生效
  6. 注意事项

在 PHP 中实现响应压缩,主要有两种方式:自动压缩(推荐)手动压缩


自动压缩(最简单推荐)

php.ini 或服务器配置中开启:

修改 php.ini

zlib.output_compression = On
zlib.output_compression_level = 6
  • zlib.output_compression = On:启用输出压缩
  • zlib.output_compression_level:压缩级别(1-9,6 是平衡值)

在 PHP 代码中动态设置

<?php
ini_set('zlib.output_compression', 'On');
ini_set('zlib.output_compression_level', 6);
// 之后的输出会被自动压缩

优点:不用修改代码,自动处理所有输出
缺点:需要在服务器层面配置


手动压缩(更灵活)

使用 ob_gzhandler() 回调函数:

<?php
// 在输出任何内容之前设置
ob_start('ob_gzhandler');
// 所有输出都会自动压缩
echo "Hello, World!";
echo str_repeat("A", 10000); // 大内容也会被压缩
ob_end_flush();

工作原理

  • ob_gzhandler 会检查浏览器是否支持 gzip
  • 如果不支持,自动输出未压缩内容
  • 支持则输出 gzip 压缩内容

完整示例(手动控制)

<?php
// 检查客户端是否支持 gzip
if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'] ?? '', 'gzip') !== false) {
    ob_start('ob_gzhandler');
} else {
    ob_start();
}
// 设置合适的 Content-Type
header('Content-Type: text/html; charset=utf-8');
echo "这是一个测试页面";
echo str_repeat("内容压缩测试 ", 500); // 生成大量重复内容
// 输出缓冲区内容并结束
ob_end_flush();

压缩大文件/响应

对于超大响应,建议分块压缩:

<?php
function compressOutput($content) {
    if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'] ?? '', 'gzip') !== false) {
        $compressed = gzencode($content, 6);
        header('Content-Encoding: gzip');
        header('Content-Length: ' . strlen($compressed));
        return $compressed;
    }
    return $content;
}
$largeContent = str_repeat("Some long content ", 10000);
// 手动压缩并输出
echo compressOutput($largeContent);

验证是否生效

浏览器开发者工具

  1. 打开 Chrome/Firefox 开发者工具 → Network
  2. 查看请求的 Response Headers
  3. 如果看到:
    • Content-Encoding: gzip ✅ 压缩生效
    • 没有这个 header ❌ 未压缩

用 curl 测试

curl -H "Accept-Encoding: gzip" -I https://your-site.com

查看返回的 headers 中是否有 Content-Encoding: gzip


注意事项

场景 建议
共享主机 使用 ob_gzhandler(大多数主机支持)
专用服务器 在 php.ini 或 Nginx/Apache 层面开启
API 接口 手动检查 Accept-Encoding 再决定是否压缩
已压缩资源 图片、视频等不要再压缩(浪费时间)

  • 简单快速:在 php.ini 开启 zlib.output_compression = On
  • 灵活控制:用 ob_start('ob_gzhandler')
  • 强力推荐:直接在 Web 服务器层面(Nginx/Apache)开启 gzip,比 PHP 层面更高效

如果你用的是 Nginx,建议在 Nginx 配置中开启 gzip,性能最好:

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

这样 PHP 代码完全不需要改,服务器自动压缩。

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