资讯专栏INFORMATION COLUMN

CodeIgniter框架中抽取部分类库做问题追踪的思路

沈俭 / 2973人阅读

摘要:背景由于各种原因,没有接入完整的调用链追踪,。显然,有基本的操作。抽取整个对象的所有对象实例队列中的结果不足框架中不可避免的使用了操作,或者其他业务代码中也使用。这样导致钩子函数无法正常完成他的使用。

背景

由于各种原因,没有接入完整的调用链追踪,(┬_┬)。但是我们自身再通过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这个函数来实现每次都必须记录。(考虑性价比吧)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31325.html

相关文章

  • 最全知识图谱综述#1: 概念以及构建技术

    摘要:本质上知识图谱旨在描述真实世界中存在的各种实体或概念及其关系其构成一张巨大的语义网络图,节点表示实体或概念,边则由属性或关系构成。图知识图谱示例知识图谱的架构知识图谱的架构包括自身的逻辑结构以及构建知识图谱所采用的技术体系架构。 引言随着互联网的发展,网络数据内容呈现爆炸式增长的态势。由于互联网内容的大规模、异质多元、组织结构松散的特点,给人们有效获取信息和知识提出了挑战。知识图谱(Know...

    wujl596 评论0 收藏0
  • 【译】CodeIgniter HMVC模块扩展使用文档

    摘要:和模块分离类似,模块扩展使得模块变得可便携的。模块化意味着模块化。但是,模块扩展更进一步,它允许这些模块互相通信。 CodeIgniter HMVC扩展说明 原文地址:Modular Extensions - HMVC 模块扩展——HMVC 模块扩展让CodeIgniter框架模块化。模块是一组独立的组件(通常有模型、控制器和视图),它们被分类在应用模块的子文件夹中,并且能够直接拖到其...

    teren 评论0 收藏0
  • CI3设置子目录控制器为默认控制器解决办法

    摘要:在框架中配置文件多目录前后台应该是个很常见的事情。于是在求学问道的途中,终于得到了比较完美的解决方法。业务需求环境需求在中实现前后台的效果。因为已经不支持设置子目录下的控制器为默认控制器的功能。 showImg(https://segmentfault.com/img/remote/1460000010545771);     在框架中配置文件多目录、前后台应该是个很常见的事情。像一...

    niceforbear 评论0 收藏0

发表评论

0条评论

沈俭

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<