APD は進化した PHP デバッガです。PHP コードのプロファイリングや デバッグの機能を提供すること、また完全なスタックトレースを出力する 機能を提供することを目的として作成されています。APD は対話形式の デバッグもサポートしていますが、デフォルトではデータをトレース ファイルに書き出すようになっています。また、さまざまなレベルの 情報(関数のコール・渡された引数・時間などを含む)をイベント発生時に 記録することができ、それを個々のスクリプト単位で有効にしたり無効に したりできます。
注意 |
APD は Zend 拡張モジュールで、PHP 内部関数のコール方法に手を加えます。 そのため、他の Zend 拡張モジュール(たとえば Zend Optimizer など)との 相性に注意が必要です。 |
現在 APD は PECL 拡張モジュールとして公開されており、 http://pecl.php.net/package/apd で入手可能です。CGI 版の PHP がインストールされており、パスの通った場所に phpize スクリプトがあることを確かめてください。
APD の最新安定バージョンをダウンロード・ビルド・インストールするには 以下のコマンドを実行します。
pear install apd |
これは、APD Zend モジュールを自動的に PHP の extension ディレクトリに インストールします。必ずこの場所でなければならないわけではありません。 zend_extension パラメータを適切に設定すれば、PHP が 読み込めるディレクトリならどこにでもインストール可能です。
Windows ユーザは http://snaps.php.net/win32/PECL_STABLE/ から php_apd.dll をダウンロードできます。
INI ファイルに以下の行を追加します。
zend_extension = /absolute/path/to/apd.so apd.dumpdir = /absolute/path/to/trace/directory apd.statement_tracing = 0 |
PHP のビルド状況によって、zend_extension ディレクティブは 以下のうちのいずれかひとつとなります。
zend_extension (非 ZTS, 非 debug ビルド) zend_extension_ts ( ZTS, 非 debug ビルド) zend_extension_debug (非 ZTS, debug ビルド) zend_extension_debug_ts ( ZTS, debug ビルド) |
Windows で APD をビルドするには、http://php.net/ で述べられているような PHP コンパイル環境が必要です。 -- 基本的には、Microsoft Visual C++・ win32build.zip・bison/flex・そしてそれらをうまく動かすためのちょっとした コツが必要になります。また adp.dsp の改行コードは必ず DOS 形式に してください。Unix 形式の改行コードだと、Microsoft Visual C++ に文句を言われます。
php.ini の設定により動作が変化します。
PHP_INI_* 定数の詳細および定義については 付録I を参照してください。
以下に設定ディレクティブに関する 簡単な説明を示します。
apd.dumpdir
stringAPD がプロファイルのダンプファイルを書き出すディレクトリを設定します。 絶対パス・相対パスのどちらも指定可能です。
apd_set_pprof_trace() へ引数を渡すことで、 指定した以外の場所に書き出すことも可能です。
apd.statement_tracing
boolean行単位のトレースをするかしないかを設定します。これを on (1) にすると、アプリケーションのパフォーマンスに衝撃的な影響を与えます。
リソース型は定義されていません。
以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。
トレースを開始するには、PHP スクリプトの最初の行で apd_set_pprof_trace() 関数をコールします。
apd_set_pprof_trace();
|
この行はスクリプト内のどの場所にでも挿入可能ですが、もしスクリプトの 最初からトレースを始めなければ、あなたをパフォーマンスのボトルネックに 導いてくれるかもしれないデータを捨てることになってしまいます。
さあ、スクリプトを実行しましょう。ダンプ結果は apd.dumpdir/pprof_pid.ext に出力されます。
ティップ: CGI 版の PHP を使用している場合は、apd が正しく動作するように '-e' フラグつきで実行し、拡張情報を有効にしてください。たとえば php -e -f script.php のように実行します。
プロファイルデータを整形して表示するには、お好みの並べ替えオプション・ 表示オプションを指定して pprofp コマンドを実行 してください。整形された出力は以下のようになります。
bash-2.05b$ pprofp -R /tmp/pprof.22141.0 Trace for /home/dan/testapd.php Total Elapsed Time = 0.00 Total System Time = 0.00 Total User Time = 0.00 Real User System secs/ cumm %Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name -------------------------------------------------------------------------------------- 100.0 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0000 0.0009 0 main 56.9 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0005 0.0005 0 apd_set_pprof_trace 28.0 0.00 0.00 0.00 0.00 0.00 0.00 10 0.0000 0.0000 0 preg_replace 14.3 0.00 0.00 0.00 0.00 0.00 0.00 10 0.0000 0.0000 0 str_replace |
この例で使われている -R オプションは、その関数を実行するのにかかった時間の 順でプロファイルテーブルを並べ替えます。"cumm call" 列には個々の関数が 何回コールされたか、そして "s/call" 列には 1 回のコールあたりの 平均所要時間が表示されます。
KCacheGrind にインポートできる形式のファイルを作成するには、 pprof2calltree コマンドを実行してください。
コメント・バグフィックス・機能拡張・あるいは開発を手伝いたいなどの場合は、 メールを apd@mail.communityconnect.com に送ってください。大歓迎します。