APD は進化した PHP デバッガです。PHP コードのプロファイリングや
デバッグの機能を提供すること、また完全なスタックトレースを出力する
機能を提供することを目的として作成されています。APD は対話形式の
デバッグもサポートしていますが、デフォルトではデータをトレース
ファイルに書き出すようになっています。また、さまざまなレベルの
情報(関数のコール・渡された引数・時間などを含む)をイベント発生時に
記録することができ、それを個々のスクリプト単位で有効にしたり無効に したりできます。
|
注意
|
|
APD は Zend 拡張モジュールで、PHP 内部関数のコール方法に手を加えます。
そのため、他の Zend 拡張モジュール(たとえば Zend Optimizer など)との
相性に注意が必要です。
|
現在 APD は PECL 拡張モジュールとして公開されており、 http://pecl.php.net/package/apd で入手可能です。CGI
版の PHP がインストールされており、パスの通った場所に phpize
スクリプトがあることを確かめてください。
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 の設定により動作が変化します。
表 1. APD の設定オプション
|
名前
|
デフォルト
|
変更の可否
|
変更履歴
|
|
apd.dumpdir
|
NULL
|
PHP_INI_ALL
|
|
|
apd.statement_tracing
|
"0"
|
PHP_INI_ALL
|
|
PHP_INI_* 定数の詳細および定義については
付録I を参照してください。
以下に設定ディレクティブに関する 簡単な説明を示します。
-
apd.dumpdir string
-
APD がプロファイルのダンプファイルを書き出すディレクトリを設定します。
絶対パス・相対パスのどちらも指定可能です。
apd_set_pprof_trace()
へ引数を渡すことで、 指定した以外の場所に書き出すことも可能です。
-
apd.statement_tracing boolean
-
行単位のトレースをするかしないかを設定します。これを on (1)
にすると、アプリケーションのパフォーマンスに衝撃的な影響を与えます。
以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、
実行時に動的にロードされている場合のみ使用可能です。
-
トレースを開始するには、PHP スクリプトの最初の行で 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 コマンドを実行してください。