您的位置:首页 > 数据库

phalcon:跟踪sql语句

2017-12-18 16:38 453 查看
转自: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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql phalcon