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

PHP CURL调用耗时超10分钟无响应,求可行解决方案

问题分析

当API执行耗时超10分钟时,CURL无法获取响应但API实际执行成功,核心原因是尽管设置了CURLOPT_TIMEOUT => 0,但PHP脚本本身、Web服务器或CURL的隐性超时限制会提前终止请求,导致无法拿到返回结果。

解决方案

以下是针对性解决步骤,按优先级排序:

1. 调整PHP脚本执行超时

PHP默认max_execution_time通常为30-60秒,即使CURL设置无限超时,PHP会先终止脚本。在代码开头添加:

set_time_limit(720); // 设置为12分钟,覆盖10分钟API执行时间
// 生产环境不推荐用set_time_limit(0)关闭超时限制

2. 明确配置CURL超时参数

CURLOPT_TIMEOUT => 0在部分环境中可能解析异常,建议直接设置足够大的数值,同时补充连接超时配置:

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); // 连接阶段超时30秒
curl_setopt($ch, CURLOPT_TIMEOUT, 720); // 整体请求超时12分钟

3. 修改Web服务器超时配置

如果脚本部署在Nginx或Apache后,服务器的代理/请求超时会覆盖CURL设置:

  • Nginx:在对应location块添加proxy_read_timeout 720s;,重启Nginx生效
  • Apache:修改httpd.conf中的Timeout 720,重启Apache生效

4. 优化HTTP协议版本(可选)

若API支持HTTP/2,改用该协议可提升连接稳定性,减少超时概率:

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);

注意:需要CURL版本≥7.33.0,且服务器已开启HTTP/2支持。

5. 异步处理(推荐长期方案)

对于超5分钟的任务,同步等待并非最优选择,建议改为异步模式:

  1. 脚本仅提交任务到API,API立即返回任务ID
  2. 通过轮询或Webhook获取任务执行结果
    示例代码片段:
// 提交任务
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => $submit_url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 30, // 提交请求只需短超时
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => "postvar1=value1"
]);
$res = curl_exec($ch);
$task_id = json_decode($res, true)['task_id'];
curl_close($ch);

// 轮询任务状态
$max_checks = 20; // 每隔30秒查一次,共10分钟
$checked = 0;
$result = null;
while ($checked < $max_checks) {
    sleep(30);
    $ch = curl_init($status_url . "?task_id=$task_id");
    $status_res = curl_exec($ch);
    $status_data = json_decode($status_res, true);
    if ($status_data['status'] === 'success') {
        $result = $status_data['result'];
        break;
    }
    $checked++;
}
curl_close($ch);
优化后的完整代码示例
set_time_limit(720); // 设置脚本超时12分钟

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt_array($ch, array(
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_CONNECTTIMEOUT => 30,
    CURLOPT_TIMEOUT => 720,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => "postvar1=value1",
    CURLOPT_HTTPHEADER => array(
        "Content-Type: application/x-www-form-urlencoded",
    ),
));

$api_res = curl_exec($ch);
if ($api_res === false) {
    $err_code = curl_errno($ch);
    $err_msg = curl_error($ch);
    // 记录错误日志便于排查
    error_log("CURL请求失败: 错误码[$err_code] - $err_msg");
} else {
    $api_obj = json_decode($api_res, true);
    // 处理API返回数据
}

curl_close($ch);

内容的提问来源于stack exchange,提问作者James Huge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:45:28