有没有一种简单的方法可以将查询记录到文件中?我有 Firebug 分析工作没有问题:
resources.db.params.profiler.enabled = "true"
resources.db.params.profiler.class = "Zend_Db_Profiler_Firebug"
将其记录到文件中而不编写一堆代码会很好。
有没有可以用 Zend_Db_Profiler_Firebug 换掉的类?
更新:请参阅下面的答案。
有没有一种简单的方法可以将查询记录到文件中?我有 Firebug 分析工作没有问题:
resources.db.params.profiler.enabled = "true"
resources.db.params.profiler.class = "Zend_Db_Profiler_Firebug"
将其记录到文件中而不编写一堆代码会很好。
有没有可以用 Zend_Db_Profiler_Firebug 换掉的类?
更新:请参阅下面的答案。
从 ZF 1.11.11 开始,没有内置的分析器类可以将查询记录到文件中。目前,FireBug 是唯一的专用 Db Profiler。
这里有两种方法可以解决它而无需大量额外代码。
首先,查看这个答案,因为它显示了如何扩展Zend_Db_Profiler
以将查询记录到queryEnd
. 如果它不能完全满足您的需求,您可以扩展Zend_Db_Profiler
并使用提供的代码作为起点。
下一个示例是对我在一些应用程序中的插件的轻微修改,我在开发应用程序时用于分析查询。此方法使用dispatchLoopShutdown()
插件来获取 Db Profiler 的实例并将查询记录到文件中。
<?php /* library/My/Page/DbLogger.php */
class My_Page_DbLogger extends Zend_Controller_Plugin_Abstract
{
public function dispatchLoopShutdown()
{
$db = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('db');
$profiler = $db->getProfiler();
if ($profiler === NULL || !($profiler instanceof Zend_Db_Profiler))
return;
// either create your logger here based on config in application.ini
// or create it elsewhere and store it in the registry
$logger = Zend_Registry::get('dblog');
$totalQueries = $profiler->getTotalNumQueries();
$queryTime = $profiler->getTotalElapsedSecs();
$longestTime = 0;
$queries = $profiler->getQueryProfiles();
if ($queries !== false) {
$content = "\nExecuted $totalQueries database queries in $queryTime seconds<br />\n";
foreach ($queries as $query) {
// TODO: You could use custom logic here to log only selected queries
$content .= "Query (" . $query->getElapsedSecs() . "s): " . $query->getQuery() . "\n";
if ($query->getElapsedSecs() > $longestTime) {
$longestTime = $query->getElapsedSecs();
}
}
$content .= "Longest query time: $longestTime.\n" . str_repeat('-', 80);
$logger->info($content);
}
}
}
要激活此插件,您可以在引导程序中使用如下代码:
/**
* Register the profiler if we are running in a non-production mode
*/
protected function _initPageProfiler()
{
if (APPLICATION_ENV == 'development') {
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new My_Page_DbLogger());
}
}
理想情况下,从长远来看,您可能希望创建一个扩展类Zend_Db_Profiler
并允许在配置中指定其他选项,例如日志文件路径、日志优先级。通过这种方式,您可以利用现有的过滤器来Zend_Db_Profiler
.