有没有办法计算在单个页面上运行的查询总数以及在Zend Framework中生成该页面所需的时间?
我们希望能够记录此信息,以便我们可以看到我们的瓶颈和需要大量资源生成的页面。
谢谢,
答案 0 :(得分:3)
当然有一个Db Profiling Tool,它叫Zend_Db_Profiler,你可以通过阅读官方文档来了解如何使用它:http://framework.zend.com/manual/en/zend.db.profiler.html#zend.db.profiler.using
基本上,你必须做这样的事情:
$db = Zend_Db_Table::getDefaultAdapter();
$profiler = $db->getProfiler();
$totalTime = $profiler->getTotalElapsedSecs();
$queryCount = $profiler->getTotalNumQueries();
至于页面的总加载时间,如果你没有使用布局,那么最好创建一个基本控制器类,在predispatch和postDispatch方法中获取当前(微)时间,然后你就可以了所有控制器的基类。也许这样的事情可能会起作用:
class Myapp_Controller_Action extends Zend_Controller_Action
{
protected $_startTime;
protected $_endTime;
protected $_totalTime;
public function preDispatch()
{
parent::preDispatch();
$this->_startTime = microtime(true);
}
public function postDispatch()
{
parent::postDispatch();
$this->_endTime = microtime(true);
$this->_totalTime = $this->_endTime - $this->_startTime;
// do something with $this->_totalTime;
}
}
应用程序中的每个控制器都应该扩展Myapp_Controller_Action而不是Zend_Controller_Action:
class IndexController extends Myapp_Controller_Action
{
...
}
答案 1 :(得分:2)
此外,这是一个调试建议。当然,它不适用于日志记录。 您可以将Zend_Db_Profiler + FireBug + FirePhp与Firefox结合使用,这些非常好用: 配置应该是(我使用的是.ini格式,但可以通过代码或XML进行调整):
database.params.profiler.enabled = true
database.params.profiler.class = Zend_Db_Profiler_Firebug
您将获得这样的结果:在数据库中花费的总时间+查询详细信息和花费的时间(以及可选参数)。伟大的每一天都使用工具!
答案 2 :(得分:0)
要查看查询,可以启用数据库适配器的分析器。为此,您必须编写应位于软件开头的以下行:
$Db->getProfiler()->setEnabled(TRUE);
当然$Db
应该是数据库适配器的一个实例。要检索您可以执行的所有查询:
$Db->getProfiler()->getQueryProfiles()
当然,您可以从官方文档中了解有关Profiler的更多信息。
答案 3 :(得分:0)
您可以挂钩插件的前后调度挂钩,并将时间戳记录在数据库表中。在帖子上,您可以查找相应的预派发印章并计算总数。
对于查询,最简单的方法可能是在每次调用查询方法时为每个用于创建查询的内容添加包装器并在包装类上增加静态计数器。在post dispatch hook中,你也可以将它记录到DB中。
要编写插件以起诉前/后调度挂钩,请查看http://devzone.zend.com/1224/front-controller-plugins-in-zend-framework/
祝你好运。