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
相关产品推荐
相关产品推荐

