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のソースを上から全部追っていこうかな。