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

Angular 1+CodeIgniter后端CURL请求超时自动取消问题

解决第三方接口超时被取消的问题

我完全理解你的困扰——明明给CURL设置了60秒的超时,可第三方服务器响应超过30秒时请求还是会被自动取消,甚至CURL之后的代码都没法执行。咱们从几个核心环节逐一排查:

1. 先检查PHP全局执行超时

PHP默认的max_execution_time通常是30秒,这个设置会直接覆盖CURL的超时配置,导致脚本提前终止。你可以在CodeIgniter的控制器方法开头临时调整:

// 把脚本最大执行时间设为120秒,留足冗余覆盖CURL的60秒超时
ini_set('max_execution_time', 120);

如果想要永久生效,修改php.ini里的max_execution_time值,之后重启Web服务器即可。

2. 确认CodeIgniter框架的限制

CodeIgniter本身可能存在请求超时相关的配置,打开application/config/config.php检查:

// 确认时间基准设置,部分版本可能影响超时计算
$config['time_reference'] = 'local';

如果你用了CodeIgniter自带的CURL Helper,一定要确保它没有覆盖你手动设置的CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT参数。

3. 给CURL添加CURLOPT_NOSIGNAL参数

在Linux环境下,CURL可能会因为信号处理问题提前终止,添加这个参数可以规避该问题:

curl_setopt_array($curl, array(
    CURLOPT_URL => $radius_url,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => array(
        "content-type: application/json",
    ),
    CURLOPT_HEADER => 0,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 60,
    CURLOPT_CONNECTTIMEOUT => 60,
    CURLOPT_NOSIGNAL => 1, // 新增这个参数解决信号中断问题
));

4. 排查前端Angular的超时设置

别忘了Angular 1的$http服务默认也有超时限制,大概率是30秒左右。检查你的前端请求代码,手动设置更长的超时:

$http.get('/your-codeigniter-api-path', { timeout: 120000 }) // 设置为120秒
    .then(function(response) {
        // 处理正常响应
    })
    .catch(function(error) {
        // 捕获超时或其他错误
    });

5. 检查Web服务器层面的超时

如果你的应用跑在Nginx或Apache上,服务器本身也有超时配置:

  • Nginx:检查proxy_read_timeout,默认60秒但部分环境可能设为30秒,确保值大于60秒
  • Apache:检查Timeout指令,同样要保证它的数值超过CURL的超时时间

额外调试建议

在CURL请求前后添加日志,方便定位问题:

error_log("开始调用第三方接口:" . date('Y-m-d H:i:s'));
$response = curl_exec($curl);
// 记录响应和错误信息
error_log("接口调用结束,响应状态:" . curl_getinfo($curl, CURLINFO_HTTP_CODE) . " 错误信息:" . curl_error($curl));
curl_close($curl);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:50:41