setName('api_log')->setDescription('the api_log command'); } protected function execute(Input $input, Output $output) { while (true) { try { $redis = Cache::store('redis')->handler(); $result = $redis->blpop(['api_log'], 5); if ($result) { $logData = json_decode($result[1], true); if (!is_array($logData) || empty($logData)) { continue; } $logData['params'] = json_encode($logData['params'] ?? [], JSON_UNESCAPED_UNICODE); $logData['response'] = json_encode($logData['response'] ?? [], JSON_UNESCAPED_UNICODE); try { ApiLogModel::create($logData); } catch (\Throwable $e) { // 如果是 MySQL 2006 错误,则重连后再执行 if (strpos($e->getMessage(), '2006 MySQL server has gone away') !== false) { Log::warning('MySQL connection lost, reconnecting...'); Db::disconnect(); // 清理旧连接 Db::reconnect(); // 重新连接 ApiLogModel::create($logData); // 重试一次 } else { throw $e; } } } else { sleep(10); // 没数据时休眠 } } catch (\Throwable $e) { Log::error('ApiLogCommand error: ' . $e->getMessage()); sleep(3); } } } }