资讯专栏INFORMATION COLUMN

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

沈俭 / 2840人阅读

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

背景

由于各种原因,没有接入完整的调用链追踪,(┬_┬)。但是我们自身再通过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
  • DataPipeline CTO陈肃:从ETL到ELT,AI时代数据集成问题与解决方案

    摘要:引言年月日,陈肃在第一期公开课上作了题为从到,时代数据集成的问题与解决方案的分享,本文根据陈肃分享内容整理而成。我叫陈肃,博士毕业于中国科学院大学,数据挖掘研究方向。和是数据集成的两种基本方式。首先是任务的限速和数据缓存问题。 引言:2018年7月25日,DataPipeline CTO陈肃在第一期公开课上作了题为《从ETL到ELT,AI时代数据集成的问题与解决方案》的分享,本文根据陈...

    MasonEast 评论0 收藏0
  • 美团餐饮娱乐知识图谱——美团大脑揭秘

    摘要:图美团大脑年月,美团点评中心开始构建大规模的餐饮娱乐知识图谱美团大脑。在建的美团大脑知识图谱目前有数十类概念,数十亿实体和数百亿三元组,美团大脑的知识关联数量预计在未来一年内将上涨到数千亿的规模。 前言 I’m sorry. I can’t do that, Dave. 这是经典科幻电影《2001: A Space Odyssey》里HAL 9000机器人说的一句话,浓缩了人类对终极...

    Jensen 评论0 收藏0

发表评论

0条评论

沈俭

|高级讲师

TA的文章

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