CodeIgniterの学習 16 - 開発時にプロファイラを有効にし情報を表示する

開発時にメモり使用量とか、ベンチマークとか、POSTデータとか実行したSQLとかを表示したくなったので、
マニュアルでやり方を引いてみた。

「アプリケーションのプロファイリング 」の項に

コントローラ のメソッド内のいずれかの場所で次のメソッドを含むコードを記述すれば、プロファイラが有効になります:
$this->output->enable_profiler(TRUE);

とあったので、試しにコントローラのコンストラクタで $this->output->enable_profiler(TRUE);
を追記すると確かにプロファイル情報が出るようになった。

こんな感じ:


開発時にはデフォルトでプロファイラを表示

せっかくなので、開発時にはプロファイラを自動的にロードするように、
hookを使ってみることにした。

マニュアルの 「フレームワークコアの拡張」のフックポイントを読むと、

post_controller_constructor
コントローラがインスタンス化された直後で、メソッドの呼び出しが起こる前に呼ばれます。

とあったので、たぶんこれを使えばよいだろう。


ちなみに、一昨日のエントリで、Zend Frameworkを読み込むために、既にhookを有効にしている。($config['enable_hooks'] = TRUE;)

以下に出てくる、application/hooks/MyClasses.php はこの時に作ったもの。


作業内容

1)application/config/config.php に、$config['my_debugger'] = TRUE; を新設
名前はなんでもいいのが、後々デバグ情報を拡張するつもりなので、ここではmy_debuggerとしている。

//開発時に自動的にプロファイラを有効にする
$config['my_debugger'] = TRUE;


2)application/config/hooks.php を編集し、post_controller_constructorのhookを追加
これでMyClassesのenable_profiler()が呼ばれるようになる。(メソッド名はなんでもいいが同名にした。)

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Hooks
| -------------------------------------------------------------------------
| This file lets you define "hooks" to extend CI without hacking the core
| files.  Please see the user guide for info:
|
|	http://codeigniter.com/user_guide/general/hooks.html
|
*/

//for my_classes
//Zend Framework、その他独自移植ライブラリ用のパスの読み込み
$hook['pre_controller'][] = array(
'class' => 'MyClasses',
'function' => 'index',
'filename' => 'MyClasses.php',
'filepath' => 'hooks'
);

//開発時に自動的にプロファイラを有効にする
$hook['post_controller_constructor'][] = array(
'class' => 'MyClasses',
'function' => 'enable_profiler',
'filename' => 'MyClasses.php',
'filepath' => 'hooks'
);
//for my_classes

/* End of file hooks.php */
/* Location: ./system/application/config/hooks.php */
 ?>


3)application/hooks/MyClasses.php を編集し、enable_profiler()を追加

<?php  if ( ! defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' );

class MyClasses {
    /**
     * includes the directory application\my_classes\ in your includes directory
     */
    function index()
    { 
        // includes the directory application\my_classes\
        // for windows tests change the ':' before APPPATH to ';'
        // Zend Framework、その他独自移植ライブラリ用のパスの読み込み
        ini_set( 'include_path', ini_get( 'include_path' ) . ':' . APPPATH . 'my_classes/' );
    } 
    function enable_profiler()
    {
        //開発時に自動的にプロファイラを有効にする
        if ( config_item( 'my_debugger' ) ) {
            $CI = &get_instance();
            $CI -> output -> enable_profiler( true );
        } 
    } 
} 

/* End of file MyClasses.php */
/* Location: ./application/hooks/MyClasses.php */
 ?>

だんだん手になじんできた。そろそろCodeIgniterのソースを上から全部追っていこうかな。