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

新主机环境下PHP CURL请求执行延迟严重问题求助

解决新主机上PHP CURL请求慢(8-10秒)的问题

刚帮朋友排查过几乎一模一样的情况——新主机上PHP脚本发起的CURL请求慢得离谱,但SSH里直接敲curl命令却秒回,原主机跑相同代码完全没问题。结合你的描述(开关SSL、换站点都不管用),大概率是PHP的CURL环境和系统CLI的curl环境不匹配导致的,给你几个亲测有效的排查和解决步骤:

1. 对比PHP CURL与系统CLI的核心配置差异

首先得确认两者使用的SSL版本、CA证书路径是否一致,这是最常见的坑:

  • 先写个简单的PHP脚本输出CURL配置:
    <?php
    var_dump(curl_version());
    ?>
    
    重点关注ssl_version、cainfo、capath这几个字段。
  • 然后在SSH里执行curl --version,把输出的SSL版本和CA路径与上面的结果对比。

我当时碰到的情况就是PHP的CURL未配置CA证书路径,导致每次SSL握手都要自行查找证书,直接卡8秒以上。解决办法是在PHP的CURL请求里手动指定系统的CA证书路径(不同系统路径不同,Ubuntu一般是/etc/ssl/certs/ca-certificates.crt,CentOS是/etc/pki/tls/certs/ca-bundle.crt):

<?php
$ch = curl_init("https://geoip-db.com/json/");
curl_setopt($ch, CURLOPT_CAINFO, "/etc/ssl/certs/ca-certificates.crt"); // 替换为你主机的CA路径
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

2. 排查DNS解析延迟问题

很多时候请求慢是因为DNS解析拖后腿,PHP使用的DNS服务器可能和系统CLI不一致:

  • 写个PHP脚本测试DNS解析耗时:
    <?php
    $start = microtime(true);
    gethostbyname("geoip-db.com");
    $end = microtime(true);
    echo "DNS解析耗时:" . round(($end - $start), 2) . "秒";
    ?>
    
  • 同时在SSH里执行time nslookup geoip-db.com对比耗时。

如果PHP的DNS解析慢,直接在CURL里指定靠谱的DNS服务器(比如谷歌的8.8.8.8):

<?php
$ch = curl_init("https://geoip-db.com/json/");
curl_setopt($ch, CURLOPT_DNS_SERVERS, "8.8.8.8,8.8.4.4");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

或者修改PHP的DNS配置,让它和系统使用同一组DNS服务器。

3. 开启TCP_NODELAY优化连接

部分主机的PHP默认关闭了TCP_NODELAY,导致TCP握手后产生额外延迟,开启后即可解决:

<?php
$ch = curl_init("https://geoip-db.com/json/");
curl_setopt($ch, CURLOPT_TCP_NODELAY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

4. 检查SELinux或防火墙限制

新主机可能开启了SELinux,限制了PHP进程的网络请求权限。你可以临时关闭SELinux测试:

sudo setenforce 0

如果关闭后CURL请求变快,那就是SELinux的问题,建议给PHP添加网络访问的SELinux规则(不建议直接关闭,存在安全风险)。另外也可以检查防火墙是否对PHP的出站请求做了限速,对比CLI curl和PHP进程的用户权限是否存在差异。

5. 排查open_basedir限制

如果PHP配置了open_basedir,可能会阻止CURL读取系统CA证书等必要文件,导致请求变慢。你可以在PHP脚本里输出echo ini_get('open_basedir');查看是否有相关限制,如果有的话,将CA证书所在目录添加到配置中即可。


内容的提问来源于stack exchange,提问作者Cat Bug

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:51:06