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

CodeIgniter控制器调用外部API重试时执行日志存储方案咨询

CodeIgniter 控制器执行日志存储方案

前置修改说明

你原有代码存在一处变量名错误:curl_setopt_array($curl1, array( 中的$curl1需要改为$curl,否则会抛出未定义变量错误。另外需在循环前新增重试计数器统计执行次数。

方案1:日志写入本地文件

无需额外建表,适合轻量日志需求,日志可存储在CodeIgniter默认的application/logs/目录下(需确保该目录有可写权限)。

实现代码(修改后完整版)

$method = $_SERVER['REQUEST_METHOD'];
if ($method != 'POST') {
    json_output(400, array('status' => '400', 'message' => 'Bad request.'));
} else  {
    $data = $this->security->xss_clean($this->input->raw_input_stream);
    $request = json_decode($data);
    $PassengerReqAirportID = $request->AirportID;
    $PassengerReqNationality = $request->Nationality;
    // 新增:重试计数器
    $retryCount = 0;
    do{
        // 每次循环计数+1
        $retryCount++;
        /* 推送数据到外部API */ 
        $curl = curl_init();
        // 修正原有变量名错误:$curl1改为$curl
        curl_setopt_array($curl, array(
            CURLOPT_URL => 'http://123.com/api',
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => '',
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_POSTFIELDS =>'{"AirportID": "'.$PassengerReqAirportID.'","Nation":"'.$PassengerReqNationality.'"}',
            CURLOPT_HTTPHEADER => array('Content-Type: application/json'),
        ));
        $response = curl_exec($curl);
        curl_close($curl);
        $response = json_decode($response,true);
        $visitID = $response['AccessionNumber'] ?? null;
    }  while (!array_key_exists('AccessionNumber',$response) ||  ($visitID == NULL));
    // ------------------- 新增:写入文件日志 -------------------
    $logDate = date('Y-m-d');
    $logTime = date('H:i:s');
    // 日志格式:日期|时间|执行次数|用户请求数据
    $logContent = sprintf(
        "%s|%s|%d|%s\n",
        $logDate,
        $logTime,
        $retryCount,
        $data // 原始用户请求JSON字符串
    );
    // 写入日志文件,按天分文件存储
    $logPath = APPPATH . 'logs/api_request_' . $logDate . '.log';
    file_put_contents($logPath, $logContent, FILE_APPEND);
    // 后续业务逻辑 处理$visitID
}

方案2:日志存入MySQL数据库

适合需要后续查询、统计日志的场景。

第一步:新建日志表

执行以下SQL创建日志存储表:

CREATE TABLE `api_exec_logs` (
  `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `log_date` date NOT NULL COMMENT '执行日期',
  `log_time` time NOT NULL COMMENT '执行时间',
  `exec_count` int NOT NULL COMMENT '执行次数',
  `request_data` text NOT NULL COMMENT '用户请求数据',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

第二步:控制器中插入日志

在do while循环结束后新增插入逻辑即可,复用上面定义的$logDate、$logTime、$retryCount、$data变量:

// 插入数据库日志,CodeIgniter3查询构造器写法
$this->db->insert('api_exec_logs', [
    'log_date' => $logDate,
    'log_time' => $logTime,
    'exec_count' => $retryCount,
    'request_data' => $data
]);

注意事项

原有循环未设置最大重试次数,若外部API长期不可用会导致请求卡死,建议修改while条件加最大重试限制,比如最多重试10次:while( ($retryCount < 10) && (!array_key_exists('AccessionNumber',$response) || ($visitID == NULL)) )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:36:03