前言
用的公司的框架,是MVC框架,看了下里面的日志基類,是操作日志,對增刪改進行記錄,
誇張的是一張業務的數據表 需要一張專門的日志表進行記錄,
就是說你寫個更新,添加的方法都必須寫一遍操作日志,代碼看了,不多,6行。
不懂為什么要這樣做,API 簡潔萬歲!~ 於是果斷在生命周期中插入接口日志。
思路1 一次插入
1、生命周期在未進入接口前拿到相關信息(包括:接口名稱,url,參數,方法,客戶端IP,訪問時間,甚至類和方法等信息),
2、然后正常往下走調用接口的方法,
3、等待接口中的方法執行完,帶着返回值回到生命周期的后半部分,在這里采集接口的調用結果,返回狀態碼,數據等信息。
4、寫入日志庫,OK
思路2 一次插入,一次更新
1、生命周期在未進入接口前拿到相關信息(包括:接口名稱,url,參數,方法,客戶端IP,訪問時間,甚至類和方法等信息),
2、直接插入日志,並記錄插入的log_id
2、然后正常往下走調用接口,
3、等待接口中的方法執行完,帶着返回值回到生命周期的后半部分,在這里采集接口的返回信息,返回狀態碼,返回數據、響應時間、耗時等信息。
4、根據log_id更新日志,OK
Action
一頓研究,發現這框架竟然跟主流框架有點合不來,生命周期中 先new 訪問的類,然后執行該類的某個方法,然后沒了~ Waht FK
進去一看,原來接口調用過程結束后 是 直接在當前執行的函數中 就echo 然后exit,不是我所熟悉的 先 return 然后在生命周期中echo並exit。
好吧,男人有苦從不說,我自清風向明月。
因為生命周期的不完整,以及程序執行過程中隨時可能exit, 故決定 分兩次記錄日志,一次插入,一次修改,並封裝一個統一返回數據的函數,確保每個接口最終都會調用
在生命周期的前半部分,進入接口前,找一個空地,蹭一蹭,然后采集相關信息(包括:接口名稱,url,參數,方法,客戶端IP,訪問時間,甚至類和方法等信息)
直接插入api_log表,返回 log_id 存到靜態變量中,
下面正常調用接口的函數,但是在函數的最后,不論成功或失敗,我們都會格式化一下返回的數據結構,
這里我們可以利用一下,在這里采集接口的返回時數據,並根據log_id進行更新操作。
僅提供插入日志的代碼進行參考,畢竟每個框架的聲明周期都有區別
/** * 添加日志 * User: LiZheng 271648298@qq.com * Date: 2019/3/20 */ public static function log() { $log_data['name'] = $_SERVER['REQUEST_URI']; //接口名 $log_data['platform'] = APP_NAME; //本應用名稱 $url = explode("/", $log_data['name']); $log_data['controller'] = $url[2]; $log_data['action'] = $url[3]; $log_data['params'] = is_string(lib_context::post_all()) ? lib_context::post_all() :json_encode(lib_context::post_all()); //請求參數 $log_data['method'] = $_SERVER['REQUEST_METHOD']; //請求方法 $log_data['header'] = $_SERVER['CONTENT_TYPE']; //請求頭 $log_data['client'] = get_client_ip() ; //當前用戶IP $log_data['server'] = $_SERVER['HTTP_HOST']; //服務器主機的名稱,端口號不是80時,會顯示端口號 self::$log_start = intval(microtime(true) * 1000); $log_data['start_time'] = time(); $info = self::$_module_log -> insert_id($log_data); self::$log_id = $info['info']; self::$api_url = $url[2].'/'.$url[3]; self::$api_folder = $url[1]; } /** * 接口json 標准輸出,並更新日志 * @param $result * User: LiZheng 271648298@qq.com * Date: 2019/3/20 */ public static function json_output($result) { $log_data['response_code'] = $result['code']; $log_data['response_msg'] = $result['msg']; if(isset($result['data'])) { $log_data['response_data'] = json_encode($result['data'],true); } else { $log_data['response_data'] = json_encode(array(),true); } $log_data['end_time'] = time(); $log_data['life'] = intval(microtime(true) * 1000) - self::$log_start; self::$_module_log -> update_by_id(self::$log_id, $log_data); echo json_encode($result); exit; }