如何在Zend Framework中记录数据库调用

时间:2012-06-03 23:22:56

标签: zend-framework

过去我使用FirePHP来记录数据库调用和响应。我现在不想这样做,因为围绕FirePHP和版本兼容性似乎存在很多问题。

还有其他选择吗?我不需要在浏览器控制台中看到日志记录。我很高兴咨询日志文件...

谢谢!

2 个答案:

答案 0 :(得分:2)

Zend_Db_ProfilerZend_Log一起应该适用于您想要做的事情。 Zend_Db_Profiler还支持开箱即用的Firebug控制台日志记录。

这是我使用的插件,它使用探查器汇总了所有页面的查询:

<?php

class My_Page_Profiler extends Zend_Controller_Plugin_Abstract
{
    public function dispatchLoopShutdown()
    {
        $db = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('db');
        $profiler = $db->getProfiler();

        $totalQueries = $profiler->getTotalNumQueries();
        $queryTime    = $profiler->getTotalElapsedSecs();

        $longestTime = 0;
        $longestQuery = null;
        $queries = $profiler->getQueryProfiles();

        $content = "Executed $totalQueries database queries in $queryTime seconds<br />\n";

        if ($queries !== false) { // loop over each query issued
            foreach ($queries as $query) {
                $content .= "\n<!-- Query (" . $query->getElapsedSecs() . "s): " . $query->getQuery() . "\n\n -->\n";
                if ($query->getElapsedSecs() > $longestTime) {
                    $longestTime = $query->getElapsedSecs();
                    $longestQuery = htmlspecialchars(addcslashes($query->getQuery(), '"'));
                }
            }

            $content .= "Longest query time: $longestTime."
                       ." <a href=\"#\" onclick=\"return false\" title=\"$longestQuery\">Mouseover for query</a><br />\n";
        }

        // Log $content here, or append it to the response body

        $this->getResponse()->setBody($this->getResponse()->getBody() .
                                      $content);
    }
}

出于我的目的,我在开发模式下在页脚中显示探查器信息,但您可以轻松更改最后一行以记录$content并根据需要重新构建内容。您还可以更改它以一次记录一个查询,而不是从所有查询中构建HTML字符串。希望这能为您提供如何使用Zend_Db_Profiler的良好实例。

要使用它,您需要先启用探查器,然后从bootstrap或application.ini注册该插件。

有几种方法可以启用分析器,您可以在Zend_Db_Profiler introduction上看到。

希望有所帮助。

答案 1 :(得分:1)

最简单的方法是创建自己的数据库分析器。例如在ini配置文件中使用firebug + firephp profiler的配置如下所示:

resources.db.params.dbname              = "dbname"
resources.db.params.username            = "username"
resources.db.params.password            = "password"
resources.db.params.profiler.enabled    = 1
resources.db.params.profiler.class      = "Zend_Db_Profiler_Firebug"

如果我们看一下Zend_Db_Profiler_Firebug它真的非常简单的一段代码,它会扩展Zend_Db_Profiler覆盖一些方法来实现firebug + firephp日志记录逻辑。

因此,我们可以通过扩展Zend_Db_Profiler来创建自己的自定义日志记录分析器。例如我们的自定义配置文件可能包含在自定义库中:CustomLib_Db_Profiler

CustomLib_Db_Profile extends Zend_Db_Profiler
{
    // log db profiling to file logic ...
}

现在我们需要做的就是打开我们的自定义日志记录例程,在我们的配置文件中将Zend_Db_Profiler_Firebug更改为CustomLib_Db_Profiler,就像这样(当然,这假定为{{1} }}前缀,在本例中,在include路径上)

CustomLib