我正在开发一个涉及执行流程剖析的项目。 我为探查器创建了一个单独的类,每次我需要分析一些东西时,我实例化探查器类的对象并开始监视。
$profiler=new Profiler($params);
$profiler->start();
//the code to be monitored//
$profiler->end();
探查器类构造函数检查参数以确定是否要记录实例ID。我使用数据库表来存储分析参数。
void _construct($params){
$this->checkConfig($params);
}
checkConfig函数对数据库执行查询以获取配置。
现在,团队计划监视数据库查询(在我们的例子中通过查询类执行)。我尝试了executeQuery函数的类似实现:
class Query{
public function executeQuery($queryParams){
$profiler=new Profiler($params);
$profiler->start();
/*Execute query*/
$profiler->end();
}
}
这会产生一个有趣的循环依赖。查询类启动一个分析器,它会触发查询,查询将再次请求分析器。
有任何解决此问题的想法吗?
答案 0 :(得分:1)
对于遇到类似问题的任何人,这是我为解决问题而构建的解决方法。
class Query{
public function executeQuery($queryParams){
static $checkProfiler;
if(!isset($checkProfiler)){
$profiler=new Profiler($params);
$checkProfiler=1;
}
$profiler->start();
/*Execute query*/
$profiler->end();
unset($checkProfiler);
}
}
start和end方法检查探查器是否处于活动状态。不确定这是否是最好的方法,但它解决了我的问题。