在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();
时间: 2024-10-25 20:13:14