xdebugの紹介

この記事は、PHP開発者向けの無料ライブラリであるxdebugを説明する一連の記事の最初の記事です。 xdebugは、PHP言語の開発者の1人であるDerick Rethansによって書かれたPHPの拡張機能です。 この記事では、xdebugのインストール方法について説明し、その基本機能について説明します。 次のパートでは、xdebugの主な機能、つまりトレース、プロファイリング、コードデバッグについて詳しく見ていきます。





xdebug拡張機能をインストールする

まず最初に、xdebugをインストールする必要があります。 この記事の執筆時点で、xdebugはバージョン2.0.1でした。 PHP APIは変更される可能性があるため、使用しているPHPのバージョンでxdebugバージョンがサポートされていることを確認する必要があります。

xdebugは4.3より前のPHPバージョンでは動作せず、PHP 6では動作しない可能性があります。しかし、PHP 4ブランチは2007年末に寿命を迎え、PHP 6は2008年末までリリースされないため、これは大きな問題ではありません。



Unixへのインストール



xdebugの可能性に飛び込む前に、インストールについて話しましょう。 Unixでは、PHP拡張ライブラリからxdebugをインストールできます。 このタイプのインストールは、すべてのシステムで機能するわけではありません。 これがシステムで発生する場合、ソースからxdebug拡張機能をコンパイルする必要があります。 ただし、最初はPECLからインストールしてみてください。

pecl install xdebug


前述のように、PECLからのインストールがシステムで機能しない場合は、ソースからxdebugをコンパイルする必要があります。 C言語コンパイラに加えて、適切なバージョンのビルドアプリケーション(Autoconf、Automake、およびLibtool)が必要です。 それらがない場合は、インストールする必要があります...

さらに、PHPには2つの必要なプログラムphpizeとphp-configがあります。これらはPHPの一部であり、インストールにも必要です。 PHPをソースからコンパイルしなかった場合、開発パッケージ(php5-dev)をインストールする必要がある場合があります。

phpizeとphp-configは、使用しているPHPのバージョンと一致する必要があるため、別のシステムからシステムにコピーしないでください。 必要なプログラムがすべて揃っていると確信したら、xdebugをダウンロードしてコンパイルできます。

wget xdebug.org/link.php?url=xdebug201

tar -xzf xdebug-2.0.1.tgz

cd xdebug-2.0.1

phpize

./configure --enable-xdebug --with-php-config = / usr / bin / php-config

作る

cp modules / xdebug.so /usr/lib/apache2/modules/xdebug.so


php-configへのパスは、システムによって異なる場合があります。 Apacheの設定に応じて、xdebug.soを正しいディレクトリにコピーする必要があります。 ただし、ファイルをコピーする代わりに、そのファイルへのシンボリックリンクを作成できます。



Windowsインストール



Windowsを使用している場合、コンパイル済みDLLをxdebug.orgからコピーできます。 使用しているPHPのバージョンを選択し、適切なリンクをクリックします。

ダウンロードしたDLLをext拡張機能用のディレクトリに保存することをお勧めします。



xdebug拡張機能のアクティブ化



これで、既製のxdebug拡張モジュールが作成されました。これは、Unix上の共有オブジェクトまたはWindows上のDLLです。 有効にするには、php.iniにエントリを追加する必要があります。

Windowsの場合:zend_extension_ts = "c:\ php \ ext \ php_xdebug-2.0.1-5.2.1.dll"

Unixの場合:zend_extension = "/ usr / lib / apache2 / modules / xdebug.so"


PHPおよびApache拡張機能が配置されているディレクトリへのパスは、システムによって異なる場合があります。 必ず絶対パスを使用してください。

Windowsの例ではzend_extension_tsを使用していることに注意してください。これは、スレッドセーフ拡張がロードされていることを意味し、Unixの場合、非スレッドセーフ拡張がロードされています。 システムの設定に応じて、この状態またはその状態がいつ必要になるかを決定する必要があります。 PHPがどのモードで実行されているかわからない場合は、phpinfo()コマンドの出力の[スレッドセーフ]タブを確認してください。

xdebugで動作する他のZend Flogging拡張機能をダウンロードすることはできません。Zendエンジンの同じ内部メカニズムを使用するため、問題が発生する可能性があります。 すべてのZend拡張機能がxdebugで機能するわけではありません。 xdebugを使用することは、重大な制限があるため、本番環境よりも開発者のマシンの方が望ましいです。 重要なルールは、xdebugでデバッグするために他のPHP拡張を使用しないことです。

php.iniを変更したため、Webサーバーを再起動します。phpinfo()コマンドの出力を確認するか、コマンドラインでphp -mを実行します。 いずれの場合も、xdebugを2回出力する必要があります。1回はPHP拡張として、もう1回はZend拡張として







xdebugをインストールした状態でPHPをアップグレードするときは注意してください。 PHPのバージョンで内部APIが変更された場合、新しいバージョンのPHPが起動しないか、奇妙なエラーが表示される場合があります。 これが発生した場合は、一時的にxdebugを無効にし、新しいバージョンのPHPおよびxdebugを待ってから、再度xdebugをオンにします。

xdebug構成用のphp.iniにはいくつかのスイッチがあり、それらのほとんどには妥当なデフォルトが設定されているため、xdebug構成について心配する必要はありません。 最も重要な構成オプションについて説明します。



var_dump()出力の改善



最も広く使用されているデバッグ方法の1つがvar_dump()関数を呼び出すことです。 var_dump()を使用しても問題はありません。 私はこれをいつもしています。 障害は、この関数を使用してデバッグするために、プログラムコードを変更する必要があることです。

xdebugは、デバッグ目的でvar_dump()を使用する代わりに興味深い選択肢を提供します。これについては、今後の記事で説明します。 しかし、今のところ、xdebugでさえ、お気に入りのvar_dumpデバッガーのパフォーマンスが向上することを聞いてうれしいでしょう。

xdebug拡張機能が読み込まれると、var_dump()関数の出力が自動的に改善されて読みやすくなります。スクリーンショットを以下に示します。







php.iniのさまざまな設定を使用して、xdebugがvar_dump()関数の出力を生成する方法を正確に構成できます。 最初に、出力文字列の長さを変更できます。 デフォルト値は512です。 長い行は自動的にトリミングされます。

文字列を完全に印刷するかどうかによって、状況と作業しているデータに依存します。 大きな文字列を扱う場合、var_dump()関数の出力が長すぎて読みにくい場合があるため、文字列を短くするという考えは非常に良いようです。 対照的に、特定の値を使用している場合、ほとんどの場合、値が完全に表示されます。

xdebugによって表示される文字列の長さを変更するには、追加します
xdebug.var_display_max_data =

php.iniでWebサーバーを再起動します。 または、ini_set関数を使用してスクリプトのこの設定を変更し、追加することができます

ini_set( 'xdebug.var_display_max_data'、);

スクリプトの最初に。 ini_set呼び出しが最初のvar_dump()呼び出しの前にあることを確認します。 実行時のxdebugの構成により、php.iniを変更するたびにWebサーバーを再起動する必要がなくなり、より柔軟に構成できます。

xdebugが出力するオブジェクトの配列要素とプロパティの数を制御することもできます。 これは、xdebug.var_display_max_childrenを変更することで実現できます(デフォルト値は128です)。 この値はオブジェクトのプロパティを表示するには十分ですが、配列を使用している場合は、値を増やす必要があるかもしれません...

ネストされたオブジェクトまたは配列を使用する場合、xdebug.var_display_max_depthを変更できます。 この設定のデフォルト値は3です。これは、配列内の3つの次元とオブジェクト内の3つのレベルのネストが表示されることを意味します。

xdebug_dump_superglobals()関数を使用して、スーパーグローバルの値を推測することもできます。 スーパーグローバル配列、特に$ _SERVERは、多数の値を含む配列であるため、どの配列キーを表示するかを明示的にxdebugに伝える必要があります。 これを行うには、xdebug.dump。をインストールします。GET、POST、SERVER、COOKIE、FILES、REQUESTまたはSESSIONのいずれかの名前です。 複数の値を表示する場合は、xdebugを引数として使用して出力する配列のキーを使用し、それらをコンマでリストします。 キーを表示するためのテンプレートとして*を使用できます。これは、$ _GETおよび$ _POSTの出力に特に役立ちます。

使用する

ini_set( 'xdebug.dump.SERVER'、 'HTTP_HOST、SERVER_NAME')


$ _SERVER ['HTTP_HOST']および$ _SERVER ['SERVER_NAME']の値を表示するには、PHPスクリプトで設定するか、php.iniでxdebug.dump.SERVER = HTTP_HOST、SERVER_NAMEを設定します。 スクリプトに渡されたすべてのGET値を表示するには、使用します

xdebug.dump.GET = *








デフォルトでは、xdebugは未定義の変数を表示しません。 未定義の変数を引き続き表示するには、xdebug.dump_undefinedパラメーターをOnに設定します。 このパラメーターをonに設定することをお勧めします。



より美しいエラーメッセージ



また、xdebugは、各エラーメッセージまたは警告の横に呼び出しスタックを自動的に表示することにより、PHPでのエラーの表示を改善します。 この呼び出しリストには、エラーメッセージが表示されるまで関数呼び出し履歴が表示されます。 PHPプログラムがますますオブジェクト指向になるにつれて、エラーはほとんどの場合ライブラリの奥深くで発生します。 呼び出しリストを使用すると、エラーが発生したコードの断片、およびこの断片の呼び出し元をすばやく見つけることができます。

バージョン5.0以降、PHPにdebug_print_backtrace()関数が登場し、関数呼び出しのリストが表示されますが、エラーが発生するたびにこの関数を明示的に呼び出すことはできません。つまり、独自のエラーハンドラーを作成する必要があります。 xdebugによって作成された呼び出しリストは、PHP関数の出力とは異なり、読みやすくなっています。

PHPと同様、xdebugはphp.iniでdisplay_erorrsパラメーターがOnに設定されている場合にのみエラーをスローします。







この呼び出しリストを見ると、関数foo()が最初に呼び出され、次にbar()、baz()が呼び出されたことがわかります。 xdebugは、呼び出された関数の名前とソースコード内の場所に加えて、これらの関数が呼び出されたときにスクリプトが使用したメモリの時間と量を表示します。

上記で、スーパーグローバルの値を表示するようにxdebugを構成する方法を既に学習しました。 さらに、ローカル変数の現在の値を表示するようにxdebugを構成できます。 エラーメッセージが発生したときにローカル変数の値を表示するには、次の行を追加します

xdebug.show_local_vars = 1


php.iniで。 ini_setも使用できます。







そのため、上でvar_dump()の出力をフォーマットするために使用したphp.inのパラメーターxdebug.var_display_max_data、debug.var_display_max_children、およびxdebug.var_display_max_depthもエラー出力フォーマットに影響します。

xdebug.collect_paramsパラメーターを使用して、関数に渡されるパラメーターに関する情報の出力を構成できます。 xdebug.collect_paramsには数値があります。0は情報がないことを意味し、4は関数のすべてのパラメーターに関する変数名と完全な情報の表示を意味します。 1から3までの値も使用できます。これは、デバッグ情報の出力の粒度が異なることを意味します。







スクリーンショットを表示するために使用される構成は次のとおりです。

xdebug.show_local_vars =オン

xdebug.dump.SERVER = HTTP_HOST、SERVER_NAME

xdebug.dump_globals =オン

xdebug.collect_params = 4


xdebugに収集するように依頼する情報が多いほど、消費するメモリが多くなり、実行時間が長くなることに注意してください。 xdebugをバトルサーバーではなく開発用にのみ使用していることを確認してください。 戦闘サーバーでHTML形式のエラーメッセージを使用するのは正しくありません;変数が定義されていない場合、データベースのログインとパスワードに関する情報を表示するのは良くありません。

スーパーグローバル変数は実行時に変更されませんが(翻訳者のメモは奇妙な声明であり、変更された多くのスクリプトを見ましたが、この記事のコンテキストではこれについては説明しません)、xdebugはデフォルトではメッセージが最初に表示されたときにのみ表示しますエラーについて。 毎回出力を繰り返したい場合は、次の設定を使用します

xdebug.dump_once =オフ


register_error_handler()を使用して独自のエラーハンドラを定義すると、拡張エラーメッセージ出力が機能しないことに注意してください。xdebugは同じ内部メカニズムを使用するため、すべてが発生します。 独自のエラーハンドラを使用する場合は、xdebug_get_function_stack()関数を使用して関数呼び出しのリストを表示できます。

オブジェクト指向のアプローチは例外を使用します。 例外はエラーではないため、例外がキャッチされない限り、xdebugは例外が発生しても呼び出しをリストしません。 キャッチされない例外は致命的なエラーです。 例外中に関数呼び出しを確認するには、次を使用します
xdebug.show_exception_trace =オン




再帰制限



別の便利な機能は、再帰ステップの制限です。これにより、再帰呼び出しの無限のシーケンスが防止されます。

xdebugは、定義済みのステップでスクリプトを停止することにより、無限再帰を防ぎます。 原則として、これは呼び出しスタックのサイズの制限です。 このパラメーターのデフォルト値は100で、この機能はデフォルトで有効になっています。 プログラムがより深い再帰を伴う場合は、設定を変更できます。

xdebug.max_nesting_level =

ただし、xdebugは無限のfor、whileループを防止せず、呼び出しスタックを増加させないため、noneに似ています。 さらに、各サイクル内でカウンターを使用し、カウンターの値が有効な桁を超えるたびにスクリプトを強制終了できます。 バトルサーバーでこのアプローチを使用することをお勧めします。無限ループが発生しないようにするためです。

おわりに



xdebugは、小さいながらもPHP開発者にとって非常に便利なツールであり、開発に使用するすべてのPHPインストールにインストールする必要があります。 バトルサーバーでxdebugを使用しないでください。パフォーマンスが低下するためです。

次の記事では、xdebugを使用したPHPアプリケーションのトレースに焦点を当て、今週後半に翻訳します。



All Articles