PHP を使用してシステム管理や従来のデータ処理などのタスク用のコマンドライン スクリプトを作成できますが、プログラミング言語は Web アプリケーションのパフォーマンスに大きな影響を与えます。使用中、各 PHP アプリケーションはサーバー上に常駐し、受信リクエストを処理するためにプロキシ (Apache など) 経由で PHP アプリケーションが呼び出されます。一般的な PHP Web アプリケーションは、リクエストごとに、短い実行後に Web ページまたは XML データ構造を取得します。
クライアント、ネットワーク、HTTP サーバー、アプリケーション コード、基盤となるデータベースを含むレイヤーで構築された Web アプリケーションは、単純な実行を想定した場合、PHP コード内のエラーを分離するのが困難になります。 PHP コードを除くすべてのレイヤーが適切に機能していると仮定しても、特にアプリケーションが多数のクラスを使用している場合、PHP コードのバグを追跡することは非常に困難になる可能性があります。
PHP ステートメント echo と関数 var_dump()、debug_zval_dump()、print_r() は、さまざまな問題の解決に役立つ、一般的で人気のあるデバッグ支援ツールです。ただし、これらのステートメント、および PEAR Log パッケージなどのさらに強力なツールは、証拠を生成するために、まずコンテキストの外で推測的に分析する必要があるフォレンジック ツールです。
推論によるデバッグは、ある意味、無謀なアプローチです。データを収集して精査し、何が問題だったのかを推測します。重要な情報が欠落している場合は、コードを再テストし、手順を繰り返し、調査を再度開始する必要があります。より効率的なアプローチは、アプリケーションの実行中にプローブすることです。リクエスト パラメーターを並べ替えたり、プロシージャ コール スタックをフィルターしたり、必要な変数やオブジェクトをクエリしたりできます。アプリケーションを一時的に中断し、変数の値が変更されたときにアラートを受け取ることができます。場合によっては、「もしも?」という質問を対話的に行うことで、実際に変数に影響を与えることができます。
デバッガーと呼ばれる特別なアプリケーションは、この「リアルタイム」または対話型検査をサポートします。プロセスを制御し、そのメモリを監視するために、デバッガを起動してプロセスに接続することができます。あるいは、インタープリター型言語の場合、デバッガーはコードを直接解釈できます。典型的な最新のグラフィカル デバッガは、コードのインデックス付けと参照を行い、複雑なデータ構造を人間が判読できる形式で簡単に表示し、同時にコール スタック、中間出力、すべての変数の値などのプログラムの状態を表示できます。たとえば、デバッガは通常、クラスのプロパティとメソッドを分類して説明します。
今回と次回の記事では、PHPのデバッグを確実に簡略化してくれるツールを紹介していきます。次回は、インタラクティブなデバッグと、PHP 専用の堅牢なデバッガである Zend デバッガに焦点を当て、それが提供する多くの機能を探っていきます。 (Zend Debugger は商用製品であり、Zend PHP 統合開発環境 (IDE) の一部です)。コードではなくビールにお金を費やさないように、オープンソースの PHP デバッガも紹介します。ただし、この記事では、証拠をより効果的に収集する方法に焦点を当てます。
CSIに似ていますが、より煩わしいだけです
コードが間違っている場合、望ましい結果が得られない場合、または完全にクラッシュした場合は、「どこで、何を、なぜ、いつ」という 4 つの質問に答える必要があります。
「どこ」はアプリケーションが最後に正常に実行されたファイルと行番号です。
「何」は間違いのコードです - 例えば、容疑者。
「なぜ」が間違いの本質である。おそらく、論理エラーおよび/またはオペレーティング システムとの相互作用によって引き起こされるエラー、またはその両方である可能性があります。
そして「when」はエラーが発生したときのコンテキストです。プログラムが終了する前に何が起こったのでしょうか? すべての犯罪と同様、十分な手がかりを集めることができれば、犯人を見つけるのに役立ちます。
フォレンジックツール Xdebug (前回の記事で PHP アプリケーションのパフォーマンスを分析するために使用したツール) は、名前が示すように、プログラムのステータスを示すいくつかの関数を提供し、コマンド システムに追加する必要がある値です。研究ツール (「参考文献」を参照)。 Xdebug をインストールすると、(表面上は) 無限再帰を防止し、スタック トレースと関数トレースに関するエラー メッセージを修正し、メモリ割り当てを監視するなどの機能が実行されます。 Xdebug には、実行時エラー診断のためにコードに追加できる一連の関数も含まれています。
たとえば、次のコードは、いくつかの xdebug_...() ステップを使用して callee() 関数をテストし、ファイル名、行番号、呼び出し関数の名前など、呼び出しプログラムの正確な場所を出力します。
リスト 1. callee() 関数をテストする手順
関数呼び出し先( $a ) {
echo sprintf("callee() が @ %s に呼び出されました: %s から %s",
xdebug_call_file(),
xdebug_call_line(),
xdebug_call_function()
);
}
$result = callee( "arg" );
?>
このコードは以下を生成します:
callee() が @ /var/www/catalog/xd.php を呼び出しました: 10 from {main}
上に戻る Xdebug のビルドとインストール
Xdebug は、Mac OS X を含む UNIX® 系オペレーティング システムのソース コードから簡単に構築できます。 Microsoft® Windows® で PHP を使用している場合は、バイナリ Xdebug モジュールの最新の PHP バージョンを Xdebug Web サイトからダウンロードできます (「参考文献」を参照)。
Debian “Sarge” Linux® と PHP V4.3.10-19 用の Xdebug をビルドしてインストールしましょう。この記事の執筆時点で、Xdebug の最新バージョンは V2.0.0RC4 で、2007 年 5 月 17 日にリリースされました。この記事を続けるには、phpize ユーティリティと php-config ユーティリティが必要で、システムの php.ini 構成ファイルを編集できる必要があります (ユーティリティがない場合は、PHP.net にアクセスしてソース コードと手順を参照してください) PHP をゼロから構築する方法について)。次の手順に従ってください:
Xdebug tarball (gzip 圧縮された .tar アーカイブ) をダウンロードします。 wget コマンドを使用すると、これを簡単に行うことができます。 $ wget http://www.xdebug.org/files/xdebug-2.0.0RC4.tgz
tarball を解凍し、ソース コード ディレクトリに切り替えます: $ tar xzf xdebug-2.0.0RC4.tgz
$ cd xdebug-2.0.0RC4
phpize を実行して、お使いの PHP バージョン用の Xdebug コードを準備します: $ phpize
設定:
PHP API バージョン: 20020918
ZendモジュールAPI番号:20020429
Zend Extension API No: 20021010
phpize の出力は、ビルド プロセスの残りの部分を微調整するために使用されるスクリプト (通常は configure という名前) です。
設定スクリプトを実行します: $ ./configure
ビルドシステムのタイプを確認中... i686-pc-linux-gnu
ホストシステムのタイプを確認中... i686-pc-linux-gnu
gcc をチェック中... gcc
C コンパイラのデフォルトの出力ファイル名を確認しています... a.out
Cコンパイラが動作するか確認中…はい
クロスコンパイルしているかどうかを確認しています...いいえ
実行可能ファイルのサフィックスをチェックしています...
オブジェクトファイルのサフィックスをチェック中...o
…
ライブラリのストリッピングが可能かどうかを確認中...はい
設定タグ「F77」をlibtoolに追加します
設定: ./config.status の作成
config.status: config.h を作成しています
make を実行して Xdebug 拡張機能をビルドします: $ make
/bin/sh /home/strike/tmp/xdebug-2.0.0RC4/libtool
--mode=compile gcc -I.
-I/home/strike/tmp/xdebug-2.0.0RC4 -DPHP_ATOM_INC
-I/home/strike/tmp/xdebug-2.0.0RC4/include
-I/home/strike/tmp/xdebug-2.0.0RC4/main
-I/home/strike/tmp/xdebug-2.0.0RC4
-I/usr/include/php4 -I/usr/include/php4/main
-I/usr/include/php4/Zend -I/usr/include/php4/TSRM
-DHAVE_CONFIG_H -g -O0 -c
/home/strike/tmp/xdebug-2.0.0RC4/xdebug.c -o
xdebug.lo mkdir .libs
…
ビルド完了
(tempnam と tmpnam に関する警告は無視しても安全です)。
makeを使うとXdebug拡張子xdebug.soが生成されます。拡張機能をインストールします: $ sudo make install
共有拡張機能のインストール: /usr/lib/php4/20020429/
続行する前に、マウスを使用して、前のコマンドで表示されたディレクトリを選択してコピーします。このパスは、拡張機能を構成する最終ステップで重要です。
好みのテキストエディタでphp.iniファイルを開き、次のコードを追加します: zend_extension = /usr/lib/php4/20020429/xdebug.so
xdebug.profiler_enable = オフ
xdebug.default_enable = オン
最初の行は Xdebug 拡張機能をロードします; 2 行目は Xdebug のプロファイラー機能を無効にし (単純にするためです)、3 行目は拡張デバッグ機能を有効にします。
Xdebug 拡張機能がインストールされ有効になっていることを確認するには、Web サーバーを再起動し、コード
を使用して単純な 1 行の PHP アプリケーションを作成します。ブラウザで http://localhost/phpinfo.php などのファイルを指定して下にスクロールすると、図 1 のような内容が表示されるはずです。
図 1. Xdebug 拡張機能がインストールされ、実行されているかどうかを確認します
注: phpinfo() の出力に Xdebug セクションが表示されない場合は、Xdebug の読み込みが失敗しています。 Apache エラー ログに理由がリストされています。一般的なエラーには、zend_extension への間違ったパスや他の拡張機能との競合が含まれます。たとえば、XCache と Xdebug を使用する必要がある場合は、必ず最初に XCache をロードしてください。ただし、Xdebug は開発中に使用することを目的としており、xdebug.so へのパスが正しいことを前提としているため、他の拡張機能を無効にして再試行する必要があります。その後、拡張機能を再度有効にして、キャッシュの影響などの追加のテストを実行できます。 Xdebug サイトには、その他のトラブルシューティングのヒントがいくつかあります。