背景由于种种原因,无法访问到完整的调用链跟踪(┬_┬)。但是我们通过php的curl调用各个端的接口时,会请求多次。那么有没有办法在不植入业务代码的情况下捕获这些curl请求呢?很明显,ci有基本的钩子操作。当相关节点连接时,我们可以选择将这些收集到的数据异步发送到指定的监听器。curl类库(部分代码)classYcurl{public$resource_arr;公共静态$resource_id=0;//resource(资源句柄idpublic$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'];如果($this->send_redis_email){redis_list_add(json_encode($this->requests,320));}}hooksconfig从ci对象中提取curl对象,其他自定义对象也可以同理$hook['post_system'][]=array('class'=>'Curl_trace','function'=>'_split_ci_of_curl','filename'=>'curl_trace.php','filepath'=>'hooks'curl_trace.phpci=&get_instance();}/***抽取整个ci对象的所有curl对象实例*@time2019/3/111:12*@authortongbo*/publicfunction_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)or1){foreach(get_object_vars($this->ci)as$name=>$ci_object){if(is_object($ci_object)){if($ci_objectinstanceofYcurl){$curls[get_class($this->ci)."/{$func}:$"。$name]=$ci_object;}}}if(!empty($curls)){foreach($curlsas$ctl_func=>$curl){foreach($curl->requestsas$index=>$single_curl_obj){$tmp[$ctl_func][$索引]=$single_curl_obj;$tmp[$ctl_func][$index]['record_time']=date('YmdH:i:s'.substr((string)microtime(),1,8).'e');redis_list_add(json_encode([$ctl_func."_".$index,$tmp[$ctl_func][$index]],320));}}}}}}Insufficientresultsinthequeue退出操作或者其他业务代码在ci框架中不可避免地使用也是这样使用的,导致hook函数无法正常使用完成。除了对不必要的退出进行必要的监管外,我们还可以使用函数register_shut_down来记录每次。(考虑性价比)
