phalcon:跟蹤sql語句

追憶丶年華發表於2018-01-16

phalcon沒有像yii那些框架一樣內建trace工具,所以我們只能自己搞。

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

相關文章