本文目录导读:

在 PHP 中实现 CDN 压缩,主要分为服务端压缩和CDN 边缘节点压缩两种思路,下面我会分别说明它们的配置方法和适用场景。
服务端压缩(PHP 负责压缩)
这种方案是指你的 PHP 服务器(源站)先对资源进行压缩,然后再传给 CDN,CDN 缓存的是压缩后的版本。
使用 PHP 内置压缩函数
<?php
// 获取需要压缩的内容
$content = "大量HTML/CSS/JS代码...";
// 使用 gzdeflate 或 gzcompress
$compressed = gzdeflate($content, 9); // 9 是压缩级别(0-9,9最压缩)
// 或者更适合 HTTP 的 gzencode
$compressed = gzencode($content, 9);
// 设置响应头
header('Content-Encoding: gzip');
header('Content-Length: ' . strlen($compressed));
header('Content-Type: text/html; charset=utf-8');
echo $compressed;
?>
修改 php.ini(推荐)
在 php.ini 中启用自动输出压缩:
; 开启输出压缩 zlib.output_compression = On zlib.output_compression_level = 5 ; 1-9,建议5-6平衡性能 ; 或者使用 gzip 模式 zlib.output_compression = 4096 ; 代表 gzip 模式
或者在 .htaccess 中配置:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
AddOutputFilterByType DEFLATE application/javascript application/x-javascript application/json
</IfModule>
CDN 边缘节点压缩(推荐)
更高效的方案是由 CDN 自动处理压缩,CDN 会根据请求头中的 Accept-Encoding 决定是否压缩。
配置步骤:
- 在 CDN 控制面板开启 Gzip/Brotli(大多数主流 CDN 默认开启)
- 源站 PHP 不要预先压缩(避免双重压缩浪费性能)
- 确保源站返回正确的
Content-Type头
<?php
// 源站返回原始内容即可,CDN 会自动压缩
header('Content-Type: application/javascript');
header('Cache-Control: max-age=3600');
// 输出原始 JS 代码
echo file_get_contents('script.js');
?>
混合方案(最优解)
结合服务端和 CDN 的优点:
<?php
// 1. 检查 CDN 是否已经处理了压缩
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) &&
strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false &&
!isset($_SERVER['HTTP_CDN_COMPRESSED'])) {
// 2. 如果不确定 CDN 是否压缩,先判断
$content = getYourContent();
// 3. 计算内容大小,小文件不需要压缩
if (strlen($content) > 1024) { // 大于 1KB 才压缩
$compressed = gzencode($content, 6);
header('Content-Encoding: gzip');
header('Content-Length: ' . strlen($compressed));
echo $compressed;
} else {
echo $content;
}
} else {
// 直接输出
echo getYourContent();
}
?>
压缩性能对比
| 压缩方式 | CPU 消耗 | 传输效率 | 缓存效果 | 适用场景 |
|---|---|---|---|---|
| CDN 边缘压缩 | 低 | 高 | 好 | 静态资源(JS/CSS/图片) |
| PHP 服务端压缩 | 高 | 中 | 一般 | (HTML/API响应) |
| 预压缩文件 | 极低 | 极高 | 极好 | 大型静态文件 |
预压缩文件(最佳实践)
对于大型静态资源,提前在服务器上生成 .gz 文件:
<?php
$file = '/path/to/style.css';
$gz_file = $file . '.gz';
// 检查是否有预压缩文件
if (file_exists($gz_file)) {
header('Content-Type: text/css');
header('Content-Encoding: gzip');
header('Content-Length: ' . filesize($gz_file));
readfile($gz_file);
exit;
}
?>
CDN 压缩配置示例(以 CloudFlare 为例)
- 登录 CDN 控制面板
- 找到 Speed → Optimization
- 开启 Auto Minify(自动压缩 HTML/CSS/JS)
- 开启 Brotli 压缩(比 Gzip 压缩率更高)
- 配置缓存规则:设置合适的 TTL(如 30 天)
总结建议
- 小型网站:直接使用 CDN 的自动压缩功能(无需修改 PHP 代码)
- 中型网站:在 PHP 中开启
zlib.output_compression - 大型网站:使用预压缩文件 + CDN 边缘压缩的混合方案
- API 服务:在 PHP 中按需压缩(根据
Accept-Encoding头)
最推荐的方案是:让 CDN 处理压缩,源站 PHP 只负责输出原始内容,这样既不会增加服务器 CPU 负担,又能享受 CDN 边缘节点的高效压缩能力。