phalcon跟踪model模型中sql语句执行 最后一条执行sql语句

phalcon框架在调试的过程中,调试sql语句比较繁琐,比如国内的thinkphp 有lastsql()方法。但是phalcon没有类似的方法。

在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();