2013年12月27日金曜日

PHPフレームワークのPhalconで、SQL文のプロファイリング

PHPフレームワークのPhalcon(1.2.4)で、SQL文のプロファイリングです。利用してみると、実際にどのようなSQL文が利用されているのか把握できます。

手順は2段階。

1, Profilerを読み込む。
2, コントローラーで利用できるようになる。

/public/index.php
$di->set('profiler', function(){
  return new \Phalcon\Db\Profiler();
}, true);

$di->set('db', function() use ($config, $di) {

  $eventsManager = new \Phalcon\Events\Manager();

  $profiler = $di->getProfiler();

  $eventsManager->attach('db', function($event, $connection) use ($profiler) {
    if ($event->getType() == 'beforeQuery') {
      $profiler->startProfile($connection->getSQLStatement());
    }
    if ($event->getType() == 'afterQuery') {
      $profiler->stopProfile();
    }
  });

  $connection = new \Phalcon\Db\Adapter\Pdo\Mysql(array(
    'host' => 'sample_host',
    'username' => 'sample_username',
    'password' => 'sample_password',
    'dbname' => 'sample_dbname',
    'options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
      )
  ));

  $connection->setEventsManager($eventsManager);

  return $connection;
});
/app/controllers/NewsController.php
$profiles = $this->di->get('profiler')->getProfiles();

foreach ($profiles as $profile) {
  print "<pre>" ;
  print_r($profile->getSQLStatement())  ;
  print "\n" ;
  print_r($profile->getInitialTime()) ;
  print "\n" ;
  print_r($profile->getFinalTime()) ;
  print "\n" ;
  print_r($profile->getTotalElapsedSeconds()) ;
  print "</pre>" ;
}
実際に設定してみたサイトがこちら



参考サイト
PhalconのSQLログをファイルに出力する(Signal Elevenさん)

0 件のコメント:

コメントを投稿