CodeIgniterフレームワークでクラスライブラリの一部を抽出して問題追跡を行う考え方
3732 ワード
背景
様々な理由で、完全な呼び出しチェーン追跡にアクセスしていません.しかし,我々自身がphpのcurlを介して各エンドインタフェースを呼び出すと,何度も要求される.では、ビジネスコードをインプラントせずに、これらのcurlのリクエストをキャプチャする方法はありませんか.明らかにciには基本的なhook操作がある.関連ノードの場合、これらを収集した非同期方式で指定されたリスナーに選択的に送信することができます.
Curlクラスライブラリ(一部コード)
hooks config
ciオブジェクトからcurlオブジェクトを抽出すると,他のカスタムオブジェクトも同様に考えることができる.
curl_trace.php
キュー内の結果
不足
ciフレームワークではexit操作が避けられないか,他のビジネスコードでも使用される.これにより、フック関数が正常に使用できなくなります.不要なexitを規範化する必要があるほか、registerを使用することもできます.shut_downという関数は毎回記録しなければならない.(性価比を考えましょう)
様々な理由で、完全な呼び出しチェーン追跡にアクセスしていません.しかし,我々自身がphpのcurlを介して各エンドインタフェースを呼び出すと,何度も要求される.では、ビジネスコードをインプラントせずに、これらのcurlのリクエストをキャプチャする方法はありませんか.明らかにciには基本的なhook操作がある.関連ノードの場合、これらを収集した非同期方式で指定されたリスナーに選択的に送信することができます.
Curlクラスライブラリ(一部コード)
class Ycurl
{
public $resource_arr;
public static $resource_id = 0; // (resource handle id
public $save_requests = true;// ,
public $requests = array();//n 、 , ( )
public $request_counts = 0;// ,
public $send_redis_email = false;//
...
$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));
}
}
}
}
}
}
キュー内の結果
不足
ciフレームワークではexit操作が避けられないか,他のビジネスコードでも使用される.これにより、フック関数が正常に使用できなくなります.不要なexitを規範化する必要があるほか、registerを使用することもできます.shut_downという関数は毎回記録しなければならない.(性価比を考えましょう)