phalcon:跟踪sql语句

来源:互联网 发布:金十数据直播间 编辑:程序博客网 时间:2024/05/20 22:29

转自:https://my.oschina.net/cxz001/blog/289776

在phalcon里有一个\Phalcon\Db\Profiler 类,这个类可以用来记录sql语句并计算消耗的时间。

那么如何使用它呢?

手册里其实已经提供了方法,总结如下:

1.向$di里注册profiler服务

$di->set('profiler', function(){    return new \Phalcon\Db\Profiler();}, true);

2.注册db服务时,注册事件

$di->set('db', function() use ($di) {    //新建一个事件管理器    $eventsManager = new \Phalcon\Events\Manager();    //从di中获取共享的profiler实例    $profiler = $di->getProfiler();    //监听所有的db事件    $eventsManager->attach('db', function($event, $connection) use ($profiler) {        //一条语句查询之前事件,profiler开始记录sql语句        if ($event->getType() == 'beforeQuery') {            $profiler->startProfile($connection->getSQLStatement());        }        //一条语句查询结束,结束本次记录,记录结果会保存在profiler对象中        if ($event->getType() == 'afterQuery') {            $profiler->stopProfile();        }    });    $connection = new \Phalcon\Db\Adapter\Pdo\Mysql(array(        "host" => "localhost",        "username" => "root",        "password" => "secret",        "dbname" => "invo"    ));    //将事件管理器绑定到db实例中    $connection->setEventsManager($eventsManager);    return $connection;});

3.程序中调出sql记录

//执行一些查询Robots::find();Robots::find(array("order" => "name"));Robots::find(array("limit" => 30));//获取所有的prifler记录结果,这是一个数组,每条记录对应一个sql语句$profiles = $this->di->get('profiler')->getProfiles();//遍历输出foreach ($profiles as $profile) {   echo "SQL语句: ", $profile->getSQLStatement(), "\n";   echo "开始时间: ", $profile->getInitialTime(), "\n";   echo "结束时间: ", $profile->getFinalTime(), "\n";   echo "消耗时间: ", $profile->getTotalElapsedSeconds(), "\n";}//直接获取最后一条sql语句echo $this->di->get('profiler')->getLastProfile()->getSQLStatement();
原创粉丝点击