本文目录导读:

- 方法一:使用
ob_gzhandler(最常用) - 方法二:使用
zlib.output_compression(PHP.ini 全局配置) - 方法三:手动实现 Gzip/Brotli 压缩(更灵活)
- 方法四:使用 Web 服务器压缩(Nginx / Apache)
- 最佳实践建议
- 注意事项
在 PHP 中实现动态压缩,通常指 服务器在输出内容之前自动压缩 HTML、CSS、JavaScript 或 API 响应数据,以减少传输体积、提升加载速度。
PHP 本身没有专门的“压缩函数”用于直接压缩输出内容,而是依赖于 输出缓冲(Output Buffering) 配合 Gzip/Brotli 压缩扩展。
以下是几种常见的 PHP 动态压缩实现方式:
使用 ob_gzhandler(最常用)
这是 PHP 内置的最简单的动态压缩方式,它会在输出内容时自动判断客户端是否支持 Gzip 压缩,并进行压缩。
<?php
// 开启输出缓冲并设置压缩处理函数
// 必须放在任何实际输出(echo、print、HTML 内容)之前
ob_start('ob_gzhandler');
// --- 你的所有业务逻辑和输出 ---
echo "<h1>Hello, this content will be compressed!</h1>";
for ($i = 0; $i < 100; $i++) {
echo "Line " . $i . "\n";
}
// --- 结束 ---
// 刷新并输出压缩后的内容
ob_end_flush();
?>
优点:
- 一行代码即可实现。
- 自动处理
Accept-Encoding头部。 - 兼容性好。
缺点:
- 只支持 Gzip,不支持更高效的 Brotli(除非手动实现)。
使用 zlib.output_compression(PHP.ini 全局配置)
如果你希望整个网站或所有 PHP 页面都自动压缩,可以在 php.ini 中直接开启:
; 在 php.ini 中设置 zlib.output_compression = On ; 可选:设置压缩级别 (1-9, 9 压缩率最高但更耗 CPU) zlib.output_compression_level = 6
或者 在 PHP 代码中动态设置(必须在任何输出之前):
<?php
ini_set('zlib.output_compression', 'On');
ini_set('zlib.output_compression_level', '6');
// 之后的所有输出都会自动被压缩
echo "This gets compressed automatically.";
?>
优点:
- 无需修改业务代码。
- 性能较好(PHP 内部实现)。
缺点:
- 无法精细控制(如只压缩特定页面或特定类型)。
- 如果代码中已有
ob_gzhandler,可能会冲突。
手动实现 Gzip/Brotli 压缩(更灵活)
如果你需要更精细的控制(根据用户代理选择压缩算法、压缩前做其他处理),可以手动使用 gzencode() 或 Brotli 函数。
<?php
// 检测客户端是否支持 Gzip 或 Brotli
$accept_encoding = $_SERVER['HTTP_ACCEPT_ENCODING'] ?? '';
$use_gzip = false;
$use_brotli = false;
if (strpos($accept_encoding, 'br') !== false && extension_loaded('brotli')) {
$use_brotli = true;
} elseif (strpos($accept_encoding, 'gzip') !== false && extension_loaded('zlib')) {
$use_gzip = true;
}
// 开始输出缓冲
ob_start();
// --- 你的内容输出 ---
echo "Content that may be compressed...";
// ---
$content = ob_get_clean(); // 获取内容并清空缓冲
if ($use_brotli) {
header('Content-Encoding: br');
echo brotli_compress($content, 6); // 需要安装 brotli 扩展
} elseif ($use_gzip) {
header('Content-Encoding: gzip');
echo gzencode($content, 6);
} else {
echo $content; // 不压缩
}
?>
优点:
- 支持多种压缩算法(Gzip、Brotli、Deflate)。
- 可随意控制压缩时机和内容。
- 适合需要特殊逻辑(如排除小文件、排除特定 URL 等)的情况。
缺点:
- 代码量稍大。
- 需要小心处理 HTTP 头部(
Content-Encoding、Content-Length等)。
使用 Web 服务器压缩(Nginx / Apache)
这是最推荐的高性能方案,因为 Web 服务器在传输层压缩,不消耗 PHP 进程资源。
Nginx 配置示例:
# 在 server 或 location 块中 gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_comp_level 6; gzip_min_length 1000; gzip_vary on; # 如果需要 Brotli(需安装 ngx_brotli 模块) brotli on; brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; brotli_comp_level 6;
Apache 配置示例(使用 mod_deflate 或 mod_brotli):
# 在 .htaccess 或 httpd.conf 中 AddOutputFilterByType DEFLATE text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript
优点:
- 性能最佳,无 PHP 开销。
- 可全局生效,无需修改代码。
- 支持多种算法。
缺点:
- 需要服务器权限修改配置。
- 如果服务器不负责压缩(如 CDN 前置),可能不生效。
最佳实践建议
| 场景 | 推荐方案 |
|---|---|
| 单页面或小项目 | ob_start('ob_gzhandler') |
| 整个站点需要压缩,有服务器权限 | Nginx/Apache 配置(性能最好) |
| 需要 Brotli 压缩 | 手动实现(或 Nginx + Brotli 模块) |
| 共享主机无权限改配置 | ini_set('zlib.output_compression', 'On') |
| API 响应压缩 | 方法一或方法四(根据 API 框架决定) |
注意事项
- 不要重复压缩:Web 服务器已经启用 Gzip,PHP 中再使用
ob_gzhandler会导致二次压缩报错。 - 才需要压缩:静态文件(图片、视频、PDF 等)通常已由服务器配置压缩,PHP 动态压缩主要用于 HTML/JSON/XML/CSS/JS。
- 压缩级别平衡:
level 6通常是不错的选择,level 9压缩率提升不明显但 CPU 消耗增加。 - Content-Length:压缩后 PHP 会自动移除
Content-Length头(或由服务器计算),无需手动处理。
一句话总结:对于绝大多数 PHP 开发者,最快捷的方式是在所有输出前加 ob_start('ob_gzhandler');追求性能则使用 Nginx 的 gzip on;。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播