PHPのデバッグ-PHPコードをデバッグする方法(Drupalのデバッグ手法が含まれています!)

公開: 2019-09-03

デバッグは、開発者が楽しみにしていることではありません。 開発者はバグを嫌いますが、高品質のソフトウェアを構築できるようにするためには、デバッグは開発者の生活に欠かせない要素です。 すべてのPHP開発者は、コードをデバッグするためのさまざまなスタイルと頼りになる方法を持っています。 これは、彼らの経験、問題解決のアプローチ、そして最も重要なことに、彼らが手にしている時間の長さに依存します!

デバッグはどれほど重要で、なぜコードをデバッグする必要があるのですか?

デバッグは、高品質の結果を保証するソフトウェア開発ライフサイクルの不可欠な部分です。
これを想像してください-コードベースは大きいです、あなたはプロジェクトに不慣れです、あなたはプロジェクト/機能の多くの詳細を持っていません。 しかし、あなたはバグを修正することになっています。 どこから始めますか? まず、コードを段階的に分析して、何が行われ、どこで問題が発生しているのかを理解します。 それは、私の友達、デバッグです。 デバッグは、練習と経験でより良くなることができる芸術です。

PHPコードをデバッグする方法

さて、これが私の開発キャリアで出くわした事例です。 Wordpress上に構築されたコマースサイトがあり、チェックアウトプロセスに約5〜8分かかり、私はそれを解決するように頼まれました。 この場合、Wordpressでどのように機能するかについてはあまり知識がありません。 そこで、リストからオプションを1つずつチェックすることから始めました。(a)プラグインが原因ですか? (b)テーマに関連していますか? (c)カスタムコードベースですか? 等

PHPのデバッグとこのケースの解決に役立ったツールはBlackfireです。 これにより、プロセス全体の各関数にかかる時間である、すべての関数のスタックトレースのよりユーザーが読みやすいオプションが提供されます。 これを使って、チェックアウトプロセスを食いつぶしている関数を見つけました。 必要なのは、コードベースにキーを追加するためのセットアップだけで、ドキュメントを使用して機能を分析する準備が整います。
したがって、phpデバッグの複数の方法に関する知識があれば、バグを解決できます。

コードのデバッグ手法

PHPのデバッグに使用したいくつかの手法について説明します。
作成した関数またはメソッドが呼び出されているかどうかを確認するための簡単で最も一般的な方法は、出口を作成することです。 これを使ったことがない開発者はいないでしょう!
いくつかの変数の値を確認するには、print_r()、var_dump()、var_export()。 さて、違いを見てみましょう。

例:

 配列を想定する 
$ a = array(1、array( "a"、 "b"));
print_r($ a);

 
配列
((
[ 0 ] => 1
[ 1 ] =>配列
((
[ 0 ] => 'a'
[ 1 ] => 'b'
)。
)。

これにより、人間が読める形式と変数に関する情報が得られます。 また、print_r($ var、true)を使用して変数に格納することもできます。

 var_dump($ a);
 配列 3 ){
[ 0 ] =>
int( 1 
[ 1 ] =>
  配列 2 ){
[ 0 ] =>
string( 1  "a"
[ 1 ] =>
string( 1  "b"
}
}

これは、タイプ、各値の長さとともに出力されます。 そして、これはprint_r()に比べて高速です
var_export($ a);

 配列
  0 => 1 
  1 =>
  配列
    0 => 'a' 
    1 => 'b' 
)、
)。

これは、タイプ、各値の長さとともに出力されます。 そして、これはprint_r()に比べて高速です
var_export($ a);

変数が存在する場合は有効なphpを返し、存在しない場合はfalseを返します。 つまり、var_exportの出力をphpファイルで直接使用できます。

Drupalコアが提供するdebug($ var、NULL、TRUE)を利用したことがありますか? これは、phpデバッグ関数に渡された引数に基づいてprint_r()またはvar_exportを使用します。

以下のような警告についてはどうでしょうか。コードのどの行がそのような警告を引き起こしているのかについての手がかりがありません。

警告: 485行目の/modules/node/node.moduleのforeach()に無効な引数が指定されました。

ノードモジュールが呼び出される場所が非常に多いことはわかっています。 では、これをどのように解決しますか? 他の外部リソースを使用せずに高速化する方法の1つは、PHP関数debug_backtrace()を使用することです。 「drupal_set_message」に移動します。これは、警告を出力するメソッドです。 その関数に以下の行を入れてください

debug_backtrace();

出力:

配列
((
[ 0 ] =>配列
((
[ファイル] => /includes/common.inc
[行] => 552
[関数] => drupal_set_message
[ args ] =>配列
((
[ 0 ] =>警告:無効

のforeach()に指定された引数

504行目の/modules/node/node.module。
[ 1 ] =>エラー
)。

)。

[1] =>配列
((
[ファイル] => / modules / node / node.module
[行] => 504
[関数] => error_handler
[args] =>配列
((
[ 0 ] => 2
[ 1 ] =>無効な引数
foreach()に提供
[ 2 ] => / modules / node /
node.module
[ 3 ] => 504
[ 4 ] =>配列
((
[パラメータ] =>
[改訂] =>
[リセット] =>
..。
)。

)。

)。

[2] =>配列
((
[ファイル] => / sites / all / modules / custom / custom_module
/custom_module.module
[行] => 10
[関数] => node_load
[args] =>配列
((
[ 0 ] =>
)。

)。

[3] =>配列
((
[ファイル] => /includes/form.inc
[行] => 365
[関数] => custom_module_form_alter
[args] =>配列
((
..。

この関数は、警告を発生させるプロセスで呼び出されるすべての関数のスタックを表示します。 制限を制限するようにしてください。制限しないと、スタックの表示に時間がかかりすぎる場合、PHPは「メモリが使い果たされました」というメッセージを表示します。

CLIによるデバッグ:

phpdbgを聞いた! はい、コマンドラインからphpファイルをデバッグするために使用されるPHP5.6 +から利用可能なphp拡張機能があります。
ターミナルを開き、「phpdbg」と入力します。 これにより、インタラクティブなphpデバッガシェルが起動します。 ブレークポイントを使用することもできます! PHPをデバッグするための隠された方法を試してみてください。
唯一の問題は、phpdbgをより有効に活用するには、phpdbgのコマンドに慣れる必要があるということです。

Drupalによるデバッグ:

Devel Kint: Drupal開発者はこれをかなり頻繁に使用します。 KintはDevelモジュールのサブモジュールであり、dump()と一緒にDrupal8小枝テンプレートをデバッグするために使用できます。

DBログ:このDrupalモジュールを知らないのは誰ですか?! D7ではwatchdog()であり、D8ではロガーサービスです。

\ Drupal :: logger( 'my_module' )-> debug($ message);

しかし、これが大好きなのにこのモジュールの使用を推奨しない唯一の理由は、ログメッセージが毎回データベースに書き込まれるためです。

そして、それが巨大なデータベースである場合、これはさらに悪化し、パフォーマンスに影響を与えると想像してください。 そのため、実稼働サイトでDBLOGモジュールを使用することはお勧めしません。
それでもDBLog、モジュールを使用して、パフォーマンスへの影響を減らしたいですか? そのための解決策もあります-DBlogフィルター。 これは、データベースに書き込まれるログのタイプを制限するのに役立つ寄稿モジュールです。 たとえば、重大度「エラー」のログのみを保存する場合は、このモジュールを使用してログを構成できます。 したがって、 Dblogモジュールを完全に削除する必要はありません。 そうそう、このモジュールは私によって提供されています;)

Webプロファイラー

Webプロファイラーは、再びDevelによって提供される寄稿モジュールです。 モジュールを有効にすると、ウィンドウの下部にレポートが表示されます。 ページが読み込まれるたびに、このレポートには、ページの読み込み時間、ページで実行されているクエリの数、フォームの数、そのページのjs / cssファイルの数などが表示されます。

Webプロファイラー

はい、これはそれらをクリックすることによって各セクションの詳細さえ提供します。 たとえば、次の画像はホームページのクエリを示しています。

Xdebug

XDebug-IDEを介したデバッグ:

コーディングにIDEを使用している場合、ほとんどの人が好むデバッグの最良かつよりユーザーフレンドリーな方法は、XDebugを使用することです。 XDebugは、開発とデバッグに役立つPHP拡張機能であり、PHPStormなどのIDEで使用できるシングルステップデバッガーを提供します。 もちろん、最良の結果を得るには、使用しているIDEを使用して拡張機能をインストールおよび構成するためにより多くの労力を費やす必要があります。