phalcon:跟踪sql语句

来源:互联网 发布:网络写字员兼职 编辑:程序博客网 时间:2024/05/20 06:08

phalcon没有像yii那些框架一样内置trace工具,所以我们只能自己搞。

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

那么如何使用它呢?

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

1.向$di里注册profiler服务

?
1
2
3
$di->set('profiler',function(){
    returnnew \Phalcon\Db\Profiler();
}, true);



2.注册db服务时,顺便注册下事件 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$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记录

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//执行一些查询
Robots::find();
Robots::find(array("order"=> "name"));
Robots::find(array("limit"=> 30));
 
//获取所有的prifler记录结果,这是一个数组,每条记录对应一个sql语句
$profiles= $this->di->get('profiler')->getProfiles();
//遍历输出
foreach($profilesas $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();

转载自:http://my.oschina.net/cxz001/blog/289776

0 0
原创粉丝点击