gzip on; gzip_types application/json;Accept-Encoding: gzip 并自动解压<?php
function benchmark(bool $useGzip, int $times = 100): float
{
$url = 'https://192.168.1.100/api/large-response';
$ch = curl_init();
$common = [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT_MS => 5000,
CURLOPT_CONNECTTIMEOUT_MS => 1000,
CURLOPT_SSL_VERIFYPEER => false, // 内网测试
];
if ($useGzip) {
$common[CURLOPT_HTTPHEADER] = ['Accept-Encoding: gzip'];
$common[CURLOPT_ENCODING] = 'gzip'; // 自动解压
}
curl_setopt_array($ch, $common);
$start = microtime(true);
for ($i = 0; $i < $times; $i++) {
$data = curl_exec($ch);
if ($data === false) {
error_log("cURL error: " . curl_error($ch));
}
}
curl_close($ch);
return microtime(true) - $start;
}
// 执行
$t1 = benchmark(false);
$t2 = benchmark(true);
echo "无压缩: " . number_format($t1, 3) . "s 总计, 单次 " . number_format($t1/100*1000, 2) . "ms\n";
echo "GZIP压缩: " . number_format($t2, 3) . "s 总计, 单次 " . number_format($t2/100*1000, 2) . "ms\n";
echo "差值: " . number_format(($t2-$t1)/100*1000, 2) . "ms/次\n";
无压缩: 2.100s 总计, 单次 21.00ms
GZIP压缩: 2.600s 总计, 单次 26.00ms
差值: +5.00ms/次
| 阶段 | 无压缩 | GZIP 压缩 | 差异来源 |
|---|---|---|---|
| 网络传输 | 110 KB | ~25 KB (压缩率 ~77%) | 节省 ~85 KB 传输量 |
| 传输耗时 (千兆) | ~0.7 ms | ~0.15 ms | 节省 ~0.55 ms |
| 服务端压缩 CPU | 0 | ~0.3 ms | Nginx gzip 压缩开销 |
| 客户端解压 CPU | 0 | ~0.2 ms | cURL zlib 解压开销 |
| 总额外 CPU | 0 | ~0.5 ms | |
| 净收益 | - | - | 0.55ms 网络节省 - 0.5ms CPU 增加 ≈ 0 |
// 智能判断:仅当响应可能大于阈值时开启
function smartCurlOptions(int $expectedSize = 0): array
{
$opts = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT_MS => 10000,
CURLOPT_SSL_VERIFYPEER => true,
];
// 预期大于 20KB 或未知大小,开启 gzip
if ($expectedSize === 0 || $expectedSize > 20 * 1024) {
$opts[CURLOPT_HTTPHEADER] = ['Accept-Encoding: gzip, deflate'];
$opts[CURLOPT_ENCODING] = 'gzip, deflate';
}
return $opts;
}
GZIP 压缩是以 CPU 换带宽。在高速内网环境下,带宽充足、延迟极低,CPU 开销成为相对瓶颈,实测 关闭 GZIP 反而快 5ms/次。生产环境建议:内网微服务间通信关闭 GZIP,公网 API/网关层强制开启。可在 API 网关 (Nginx/Kong/Traefik) 统一控制,避免业务代码硬编码。