首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP cURL 开启 GZIP 压缩性能实测:局域网千兆环境下的得失分析

     編輯:PHP 綜合知識

测试背景

  • 场景:高频 API 调用,单次响应体约 110 KB
  • 网络:同机房千兆内网 (延迟 < 0.5ms)
  • 后端:Nginx 已开启 gzip on; gzip_types application/json;
  • 对比:cURL 是否发送 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
服务端压缩 CPU0~0.3 msNginx gzip 压缩开销
客户端解压 CPU0~0.2 mscURL zlib 解压开销
总额外 CPU0~0.5 ms
净收益--0.55ms 网络节省 - 0.5ms CPU 增加 ≈ 0

结论

  1. 千兆/万兆局域网:网络非瓶颈,GZIP 带来的 CPU 开销抵消传输收益,不开启反而略快。
  2. 公网/跨机房/移动网络:带宽延迟是主导因素,必须开启 GZIP,收益巨大。
  3. 响应体 < 10 KB:压缩增益微小,CPU 开销不划算,可关闭。
  4. CPU 密集型服务:若 PHP 进程 CPU 已高负载,关闭客户端解压可减少压力。

最佳实践配置

// 智能判断:仅当响应可能大于阈值时开启
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) 统一控制,避免业务代码硬编码。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved