我正在从事一个涉及执行流分析的项目。我已经为探查器创建了一个单独的类,每次需要探查某个东西时,我都会实例化探查器类的对象并开始监视。
$profiler=new Profiler($params);
$profiler->start();
//the code to be monitored//
$profiler->end();
探查器类构造函数检查params,以确定是否要记录实例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();
}
}
这产生了一个有趣的循环依赖关系。查询类启动探查器,探查器会激发一个查询,查询将再次请求探查器。
有什么解决办法吗?
对于任何有类似问题的人,这是我为解决问题而构建的解决方法。
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方法检查探查器是否处于活动状态。不确定这是否是最好的方法,但它解决了我的问题。