摘要:背景由于各種原因,沒有接入完整的調(diào)用鏈追蹤,。顯然,有基本的操作。抽取整個對象的所有對象實例隊列中的結(jié)果不足框架中不可避免的使用了操作,或者其他業(yè)務(wù)代碼中也使用。這樣導(dǎo)致鉤子函數(shù)無法正常完成他的使用。
背景
由于各種原因,沒有接入完整的調(diào)用鏈追蹤,(┬_┬)。但是我們自身再通過php的curl調(diào)用各端接口時,會請求多次。那么有沒有一種方法可以在不植入業(yè)務(wù)代碼的前提下,捕捉到這些curl的請求呢。顯然,ci有基本的hook操作。我們可以在相關(guān)節(jié)點時,可選擇的把這些收集到到的通過異步的方式發(fā)送給指定的監(jiān)聽者。
curl類庫(部分代碼)class Ycurl { public $resource_arr; public static $resource_id = 0; //資源(resource handle id public $save_requests = true;//是否保存,默認(rèn)全部保存 public $requests = array();//n次請求參數(shù)、返回參數(shù),錯誤(如果有) public $request_counts = 0;//總的請求次數(shù),可能一個頁面調(diào)用多次 public $send_redis_email = false;//是否需要以異常方式發(fā)送郵件 ... $ret = curl_exec($ch); $curl_info_arr = curl_getinfo($ch); $this->request_counts += 1; if ($this->save_requests === true) { $arg_list = func_get_args(); $this->requests[$resource_id]["url"] = $curl_info_arr["url"]; $this->requests[$resource_id]["req_params"] = json_encode([$arg_list], 320); $this->requests[$resource_id]["response"] = $ret; $this->requests[$resource_id]["http_code"] = $curl_info_arr["http_code"]; $this->requests[$resource_id]["is_error"] = curl_error($ch); $this->requests[$resource_id]["total_time"] = $curl_info_arr["total_time"]; $this->requests[$resource_id]["primary_ip"] = $curl_info_arr["primary_ip"]; if($this->send_redis_email){ redis_list_add(json_encode($this->requests,320)); } }hooks config
從ci對象中抽取curl對象,其他自定義的對象也可以同樣思路。
$hook["post_system"][] = array( "class" => "Curl_trace", "function" => "_split_ci_of_curl", "filename" => "curl_trace.php", "filepath" => "hooks"curl_trace.php
ci =& get_instance(); } /** *抽取整個ci對象的所有curl對象實例 * @time 2019/3/1 11:12 * @author tongbo */ public function _split_ci_of_curl() { $class = $this->ci->router->fetch_class(); $need_trace_controller = [ "home", "admin", ]; $func = $this->ci->router->fetch_method(); if (in_array($class, $need_trace_controller) or 1) { foreach (get_object_vars($this->ci) as $name => $ci_object) { if (is_object($ci_object)) { if ($ci_object instanceof Ycurl) { $curls[get_class($this->ci) . "/{$func}:$" . $name] = $ci_object; } } } if (!empty($curls)) { foreach ($curls as $ctl_func => $curl) { foreach ($curl->requests as $index => $single_curl_obj) { $tmp[$ctl_func][$index] = $single_curl_obj; $tmp[$ctl_func][$index]["record_time"] = date("Ymd H:i:s" . substr((string)microtime(), 1, 8) . " e"); redis_list_add(json_encode([$ctl_func . "_" . $index, $tmp[$ctl_func][$index]], 320)); } } } } } }隊列中的結(jié)果 不足
ci框架中不可避免的使用了exit操作,或者其他業(yè)務(wù)代碼中也使用。這樣導(dǎo)致鉤子函數(shù)無法正常完成他的使用。除了必要規(guī)范不必要的exit之外,我們也可以用register_shut_down這個函數(shù)來實現(xiàn)每次都必須記錄。(考慮性價比吧)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/31325.html
摘要:本質(zhì)上知識圖譜旨在描述真實世界中存在的各種實體或概念及其關(guān)系其構(gòu)成一張巨大的語義網(wǎng)絡(luò)圖,節(jié)點表示實體或概念,邊則由屬性或關(guān)系構(gòu)成。圖知識圖譜示例知識圖譜的架構(gòu)知識圖譜的架構(gòu)包括自身的邏輯結(jié)構(gòu)以及構(gòu)建知識圖譜所采用的技術(shù)體系架構(gòu)。 引言隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)絡(luò)數(shù)據(jù)內(nèi)容呈現(xiàn)爆炸式增長的態(tài)勢。由于互聯(lián)網(wǎng)內(nèi)容的大規(guī)模、異質(zhì)多元、組織結(jié)構(gòu)松散的特點,給人們有效獲取信息和知識提出了挑戰(zhàn)。知識圖譜(Know...
摘要:和模塊分離類似,模塊擴(kuò)展使得模塊變得可便攜的。模塊化意味著模塊化。但是,模塊擴(kuò)展更進(jìn)一步,它允許這些模塊互相通信。 CodeIgniter HMVC擴(kuò)展說明 原文地址:Modular Extensions - HMVC 模塊擴(kuò)展——HMVC 模塊擴(kuò)展讓CodeIgniter框架模塊化。模塊是一組獨(dú)立的組件(通常有模型、控制器和視圖),它們被分類在應(yīng)用模塊的子文件夾中,并且能夠直接拖到其...
摘要:在框架中配置文件多目錄前后臺應(yīng)該是個很常見的事情。于是在求學(xué)問道的途中,終于得到了比較完美的解決方法。業(yè)務(wù)需求環(huán)境需求在中實現(xiàn)前后臺的效果。因為已經(jīng)不支持設(shè)置子目錄下的控制器為默認(rèn)控制器的功能。 showImg(https://segmentfault.com/img/remote/1460000010545771); ????在框架中配置文件多目錄、前后臺應(yīng)該是個很常見的事情。像一...
閱讀 2153·2021-11-15 11:36
閱讀 1461·2021-09-23 11:55
閱讀 2486·2021-09-22 15:16
閱讀 2028·2019-08-30 15:45
閱讀 1862·2019-08-29 11:10
閱讀 1025·2019-08-26 13:40
閱讀 915·2019-08-26 10:44
閱讀 3168·2019-08-23 14:55