You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Nginx+PHP7.3环境下PHP Curl执行时长较Apache+PHP5.6大幅增加?

问题分析与解决方案

从你给出的curl统计数据来看,核心差异在于Pretransfer时间的暴涨:Apache+PHP5.6环境下Pretransfer仅14ms,而Nginx+PHP7.3环境下飙升至80ms,且Starttransfer与Pretransfer时间几乎重合,说明问题出在TCP连接建立后,到服务器准备好接收请求的阶段——也就是TLS握手、证书验证或curl配置差异导致的耗时增加。

可能的原因

  1. TLS版本协商差异:PHP7.3搭配的curl默认可能使用更高版本的TLS协议(如TLS1.2/TLS1.3),而PHP5.6的curl默认使用TLS1.0/TLS1.1。如果目标API服务器对高版本TLS的握手协商效率较低,就会拉长Pretransfer时间。
  2. CA证书配置问题:Nginx环境下的PHP curl可能未正确配置CA证书路径,导致证书验证时需要额外查找或下载证书链,增加耗时;或者证书文件本身存在链不完整的情况。
  3. 安全选项默认开启差异:PHP7.3的curl默认可能启用了OCSP stapling验证(证书状态查询),而老环境未开启,这个验证流程会额外消耗时间。
  4. curl版本差异:两个环境的curl底层版本不同,新的curl版本默认的握手策略、会话复用机制与老版本不同,导致握手耗时增加。

对应的解决方案

1. 强制指定TLS版本测试

在curl请求中手动指定TLS版本,匹配老环境的配置,看是否能降低耗时:

// 尝试指定TLS1.1(对应老环境的可能版本)
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_1);
// 或者尝试TLS1.2,根据测试结果调整
// curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);

2. 检查并配置CA证书

确保curl使用正确的CA证书文件,避免验证耗时:

// 指定系统默认的CA证书路径(以CentOS为例,其他系统路径可能不同)
curl_setopt($ch, CURLOPT_CAINFO, '/etc/pki/tls/certs/ca-bundle.crt');

如果是测试环境,可以临时关闭证书验证(生产环境禁止使用)来排除证书问题:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

3. 关闭OCSP stapling验证

如果是OCSP验证导致的耗时,关闭该选项:

curl_setopt($ch, CURLOPT_SSL_VERIFYSTATUS, false);

4. 启用curl会话复用

开启SSL会话缓存,复用之前的TLS会话,减少重复握手耗时:

curl_setopt($ch, CURLOPT_SSL_SESSIONID_CACHE, true);

如果是批量请求,还可以使用curl_multi或者保持长连接:

// 开启长连接
curl_setopt($ch, CURLOPT_TCP_KEEPALIVE, true);
curl_setopt($ch, CURLOPT_TCP_KEEPIDLE, 60);
curl_setopt($ch, CURLOPT_TCP_KEEPINTVL, 60);

5. 对比curl版本并调整

查看两个环境的curl版本:

# PHP环境中执行
echo curl_version()['version'];

如果差异较大,可以尝试升级或降级Nginx环境的curl版本,或者调整curl的编译参数,匹配老环境的配置。

内容的提问来源于stack exchange,提问作者04DevV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:00:27