【发布时间】:2014-11-10 05:44:01
【问题描述】:
我正在从事一个涉及执行流程分析的项目。 我为分析器创建了一个单独的类,每次我需要分析某些东西时,我都会实例化分析器类的对象并开始监控。
$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();
}
}
这会产生一个有趣的循环依赖。查询类启动一个探查器,它触发一个查询,查询将再次要求探查器。
有解决这个问题的想法吗?
【问题讨论】:
-
将
Query类注入分析器?无论哪种方式,您的代码中都有错误:executeQuery方法将一个不存在的$params变量传递给Profiler构造函数 -
我在为我的 DB 类实现监听器时遇到了同样的问题。当我使用 DB 查询实现并注册一个侦听器时,侦听器在侦听器中再次被触发,因此我最终陷入了无限循环。然后我在 DB 类中实现的是一个
muteListener()函数,当设置为true时,它会停止调用侦听器。所以在我的听众中,在我触发数据库查询之前,我设置了muteListener(true),在查询之后设置为 ?又是假的。 -
@EliasVanOotegem params var 仅用于演示目的。 executequery 函数将传递一些真实信息来确定是否要分析当前查询。
-
@nullPointer:不管怎样,
Query类不应该同时处理查询和它自己的日志记录,这违反了 SRP。注入依赖,如果你有循环依赖,很可能你没有以正确的方式开展业务 -
@EliasVanOotegem 目标是分析系统中运行的所有查询。由于系统中运行的所有查询都由单个类处理,因此我们的目标是监控查询时间。在我看来,这并不违反 SRP 原则,因为分析是一个单独的类,我们只需要在执行查询时开始和结束分析,其余的由分析器类处理。
标签: php profiling circular-dependency