为何Nginx+PHP7.3环境下PHP Curl执行时长较Apache+PHP5.6大幅增加?
问题分析与解决方案
从你给出的curl统计数据来看,核心差异在于Pretransfer时间的暴涨:Apache+PHP5.6环境下Pretransfer仅14ms,而Nginx+PHP7.3环境下飙升至80ms,且Starttransfer与Pretransfer时间几乎重合,说明问题出在TCP连接建立后,到服务器准备好接收请求的阶段——也就是TLS握手、证书验证或curl配置差异导致的耗时增加。
可能的原因
- TLS版本协商差异:PHP7.3搭配的curl默认可能使用更高版本的TLS协议(如TLS1.2/TLS1.3),而PHP5.6的curl默认使用TLS1.0/TLS1.1。如果目标API服务器对高版本TLS的握手协商效率较低,就会拉长Pretransfer时间。
- CA证书配置问题:Nginx环境下的PHP curl可能未正确配置CA证书路径,导致证书验证时需要额外查找或下载证书链,增加耗时;或者证书文件本身存在链不完整的情况。
- 安全选项默认开启差异:PHP7.3的curl默认可能启用了OCSP stapling验证(证书状态查询),而老环境未开启,这个验证流程会额外消耗时间。
- 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
相关产品推荐
相关产品推荐

