NetBeans IDEでのPHPソース・コードのデバッグ

This tutorial needs a review. You can edit it in GitHub following these contribution guidelines.

このチュートリアルに従うには、次のソフトウェアとリソースが必要です。

ソフトウェアまたはリソース 必須バージョン

NetBeans IDE

PHPダウンロード・バンドル

PHPエンジン

バージョン5

Webサーバー

Apache HTTP Server 2.2 (推奨)

PHPデバッガ

XDebug 2.0以降

準備

PHP向けのNetBeans IDEでPHPアプリケーションを正常にデバッグするには、PHPエンジン、ApacheローカルWebサーバー、およびXDebugデバッガがインストールされ、PHP開発用に構成されている必要があります。XDebugの動作に問題がある場合は、XDebugに関するNetBeans Wikiを参照したり、users@php.netbeans.orgのコミュニティに質問してください。

NetBeans IDEでのXDebugによるPHPデバッグの動作方法

NetBeans IDEからXDebugを実行すると、PHPプログラムの実行は、ブレークポイントを設定した各行で一時休止します。プログラムの実行が一時休止しているときは、プログラム変数の値など、プログラムの現在の状態に関する情報をXDebugで取得できます。実際には、これは次のワークフローを意味します。

  1. PHPソース・コードの実行を一時休止する行ごとにブレークポイントを設定します。

  2. デバッグ・セッションを開始します。

  3. ブレークポイントが設定された行に到達したら、[F7]および[F8]を押して、スクリプトを1行ずつ実行します。デバッガ・ウィンドウでアプリケーションの状態をモニターします。

  4. デバッグ・セッションを閉じます。

NetBeans IDEでのXDebugの使用方法の詳細なワークフローについては、デバッグ・セッションを参照してください。

NetBeans IDEには、ファイルのステップ実行に役立つデバッグ・ツールバーがあります。ツールバーとエディタの操作を参照してください。

デバッグ・オプション

NetBeans IDEの「オプション」には、PHPをデバッグするための特定のデフォルト設定を変更するタブが含まれています。これらのオプションを開くには、「ツール」>「オプション」(Macの場合は「NetBeans」>「プリファレンス」)に移動し、「PHP」オプションを選択して、「デバッグ」タブを選択します。

「デバッグ」タブはNetBeans IDEバージョン7.1で導入されました。以前のバージョンのNetBeansでは、デバッグ・オプションは「一般」-「PHP」タブにあります。バージョン7.1のすべてのオプションが以前のバージョンで使用できるわけではありません。
php debugging options

このパネルで次のオプションを変更できます。

  • *デバッガ・ポート。*これは、php.iniで設定された、XDebugが使用するポートです。デフォルトでは、これはポート9000です。このダイアログのポート番号は、php.iniで設定したデバッガ・ポートと同じである必要があります。このダイアログでは、XDebugが使用するポートを変更できません。XDebugが使用するポートをNetBeans IDEに通知するのみです。

  • *セッションID。*デバッグ・セッションの任意の名前。デフォルトでは、これはnetbeans-xdebugです。この値は、一部のリモートでのデバッグ・シナリオなどで、php.iniの xdebug.idekey プロパティを設定する必要がある場合に注意することが重要です。

  • *最初の行で停止。*このオプションを選択すると、デバッガ・セッションは最初のブレークポイントではなくコードの最初の行で停止します。これにより、デバッグ・セッションを起動したとき、ブラウザ・ウィンドウに切り替わるのではなく、画面がIDEにフォーカスしたままになります。

  • *ウォッチとバルーン評価。*ウォッチとバルーン評価はデフォルトで無効になっています。ウォッチとバルーン評価はXDebugを不安定化させます。

  • *構造の最大深さ。*入れ子構造(入れ子の配列、オブジェクト内のオブジェクトなど)の可視性を設定します。

  • *子の最大数。*ウォッチ評価中における配列項目の可視性を設定します。(「子の最大数」を1に設定した場合、配列が複数の項目を持つ場合でも配列の1番目の項目のみが表示されます。)

  • *リクエストされたURLを表示。*デバッグ中に新しい「出力」ウィンドウを開きます。この「出力」ウィンドウは「PHPでリクエストされたURL」という名前で、現在処理されているURLを示します。URLはクリック可能です。「出力」ウィンドウのURLをクリックすると、URLがブラウザ・ウィンドウで開きます。

  • *PHPデバッガ・コンソール。*デバッグされたスクリプトの出力を表示する新しい「出力」ウィンドウを開きます。

php.ini ファイルで output_buffering=Off と設定してください。そうしないと、「出力」ウィンドウにスクリプト出力が表示される際に遅延が生じます。

このチュートリアルでは、ウォッチをオプションで有効にする場合を除いて、これらの設定を変更する必要はありません。

ツールバーとエディタの操作

エディタではファイルの内容を表示できます。したがって、デバッグ中にエディタとデバッガ・ツールバーを組み合せて使用することで、実行中にコードをステップ実行して、ファイルの内容がブラウザ内の動作にどのように影響しているのかを確認できます。

デバッガ・ツールバーの使用

デバッグ・セッションを実行すると、エディタの上にデバッガ・ツールバーが表示されます。

debugger toolbar2
Figure 1. 一時停止状態のデバッガ・ツールバー

ツールバーでは次のアクションを実行できます。

セッションの終了(finish session button) デバッグ・セッションを終了

一時休止(pause button)

デバッグ・セッションを一時停止

再開(resume button)

デバッグ・セッションを再開

ステップ・オーバー(step over button)

実行文をステップ・オーバー

ステップ・イン(step into button)

関数コールにステップ・イン

ステップ・アウト(step out button)

現在の関数コールからステップ・アウト

カーソルまで実行(run to cursor button)

カーソル位置まで実行

 

ブレークポイントの設定

デバッガの実行を停止する位置を指定するには、ファイル内にブレークポイントを設定します。

重要: XDebugを使用するには、PHPコード内でブレークポイントを設定する_必要があります_。

ブレークポイントを設定するには、エディタで、ブレークポイントを設定する行の左マージンをクリックします。

set breakpoint
Figure 2. エディタ内でのブレークポイントの設定

ブレークポイントを除去するには、ブレークポイント・バッジ(breakpoint badge)をクリックします。

ブレークポイントは一時的に無効にすることもできます。これを行うには、ブレークポイント・バッジを右クリックし、「ブレークポイント」>「✓有効」を選択解除します。これにより、ブレークポイントが無効な状態に切り替わり、左マージンにグレーのバッジ(disabled breakpoint badge)が表示されます。

デバッグの実行中にブレークポイントに到達すると、デバッガはそのブレークポイントで停止するので、デバッグ・ウィンドウで変数を確認し、ブレークポイントに続くコードをステップ実行できます。

stop on breakpoint
Figure 3. ブレークポイントで一時停止したデバッガ

ツールチップの確認

デバッグ・セッション中にデバッガが一時停止しているときは、エディタ内でPHP識別子の上にマウス・ポインタを置いてツールチップを表示できます。選択したコール・スタック・フレーム内で識別子が有効である場合は、その値が表示されます。PHPの式を選択することもできます。式の値がツールチップに表示されます。

tool tip
Figure 4. エディタ内に表示されたツールチップ

デバッガ・ウィンドウ

デバッグ・セッションを開始すると、一連のデバッガ・ウィンドウがメイン・エディタ・ウィンドウの下に開きます。デバッガ・ウィンドウでは、コードをステップ実行しながら変数と式の値をトラックしたり、実行中のスレッドのコール・スタックを確認したり、ソースURLを確認したり、複数のデバッグ・セッションを同時に実行している場合はセッション間を切り替えたりできます。

すべてのデバッガ・ウィンドウは、IDEの「ウィンドウ」>「デバッグ」メニューからアクセスできます。デバッグ・セッションがアクティブになると、デバッガ・ウィンドウの使用を開始できます。

debugger menu
Figure 5. IDEのメイン・メニューからアクセスするデバッガのメニュー

「セッション」ウィンドウ

「セッション」ウィンドウには、現在アクティブなデバッグ・セッションが表示されます。PHPのデバッグ・セッションを開始すると、「セッション」ウィンドウにPHPデバッガのエントリが表示されます。

sessions win

NetBeans IDEでは、複数のデバッガ・セッションを同時に実行することもできます。たとえば、JavaとPHPのプロジェクトを同時にデバッグできます。この場合、「セッション」ウィンドウに2つのセッションがリストされているのが確認できます。

sessions win2

現在のセッション、つまりデバッガ・ツールバーを使用して制御できるセッションは、他のアイコンよりも目立つアイコン(current session icon)で示されます。複数のセッションを切り替えるには、現在のセッションにするセッションをダブルクリックするか、現在でないセッションを右クリックして「現在に設定」を選択します。

現在作業中のセッションが一時停止されている場合、セッションを切り替えることはお薦めできません。

また、右クリックして表示されるポップアップ・ウィンドウを使用して、セッションを終了したり(右クリックして「終了」を選択)、現在のスレッドのデバッグとセッション内のすべてのスレッドのデバッグを切り替えたり(右クリックして「スコープ」>「すべてのスレッドをデバッグ」または「現在のスレッドをデバッグ」を選択)できます。

「変数」ウィンドウ

デバッガが一時停止されているとき、「変数」ウィンドウには、選択したコール・スタック・フレームの現在の`window`オブジェクトの変数が表示されます。現在のウィンドウの各変数について1つのノードが表示されます。スーパーグローバルは別個のノードでグループ化されます。

vars win

 

コードをステップ実行しているときに一部のローカル変数の値が変わることがあります。このようなローカル変数は、「ローカル変数」ウィンドウに太字で表示されます。「値」列内を直接クリックして、変数の値を手動で変更することもできます。

「ウォッチ」ウィンドウ

ウォッチを設定するとXDebugが不安定化するため、お薦めできません。ウォッチはデフォルトで無効になっています。ただし、ウォッチを設定する場合は、追加ウォッチの使用を参照してください。

「コール・スタック」ウィンドウ

「コール・スタック」ウィンドウには、実行中に行われた一連のコールが一覧表示されます。デバッガが一時停止されているとき、「コール・スタック」ウィンドウには一連の関数コール(つまり、コール・スタック)が表示されます。最初の一時停止では、最上位のスタック・フレームが自動的に選択されます。ウィンドウ内の関数コールをダブルクリックすると、エディタ内でその行に移動します。コールがPHPクラスに対して実行された場合、そのコールをダブルクリックすると、「ナビゲータ」ウィンドウもその行に移動します。

call stack win

コール・スタック・フレームをダブルクリックして選択し、「変数」ウィンドウと「ウォッチ」ウィンドウでそのフレームの変数や式の値を確認できます。

「スレッド」ウィンドウ

「スレッド」ウィンドウは、現在アクティブなPHPスクリプトと、PHPスクリプトがブレークポイントで一時停止されているか実行中かを示します。スクリプトが実行中の場合、ブラウザ・ウィンドウに移動して、スクリプトを操作する必要があります。

threads win

「ソース」ウィンドウ

「ソース」ウィンドウには、デバッグ・セッション用にロードされたすべてのファイルとスクリプトが表示されます。現在、「ソース」ウィンドウはPHPプロジェクトで機能しません。

「ブレークポイント」ウィンドウ

「ブレークポイント」ウィンドウを使用すると、IDE内で設定したすべてのブレークポイントを表示できます。

breakpoints win

「ブレークポイント」ウィンドウでは、コンテキスト・ウィンドウでブレークポイントを有効または無効にすることができます。ブレークポイント・グループを作成することもできます。

デバッグ・セッション

一般的なデバッグ・セッションのワークフローを次に示します。

デバッグ・セッションを実行する

  1. IDEを起動し、デバッグするソース・コードが含まれるファイルを開きます。

  2. デバッガを一時休止する必要がある各行にブレークポイントを設定します。ブレークポイントを設定するには、行の先頭にカーソルを置き、[Ctrl]-[F8]/[⌘]-[F8]を押すか、または「デバッグ」>「行ブレークポイントを切替え」を選択します。

  3. 「プロジェクト」ウィンドウで現在のプロジェクト・ノードに移動し、マウスの右ボタンをクリックして、ポップアップ・メニューから「デバッグ」を選択します。IDEでデバッガ・ウィンドウが開き、ブレークポイントに達するまで、デバッガでプロジェクトが実行されます。 NOTE: 現在のプロジェクトがメインに設定されている場合は、「デバッグ」>「メイン・プロジェクトをデバッグ」を選択するか、[Ctrl]-[F5]を押すか、またはdebug main project buttonをクリックできます。

    1. 「ローカル変数」ウィンドウに切り替えます。このウィンドウには、現在の関数内で初期化されたすべての変数、その型、および値が表示されます。

    2. 関数外の変数の値を表示するには、その変数の出現箇所にカーソルを置きます。ツールチップに変数の値が表示されます。

    3. コールしているすべての関数内の行を含めてプログラムを1行ずつ実行するには、[F7]を押すか、「デバッグ」>「ステップ・イン」を選択して、「ローカル変数」ウィンドウで変数の値の変化をウォッチします。

    4. 式の変化をウォッチしてプログラムのロジックを確認するには、次の手順で新しいウォッチを定義します。

      1. 「ウォッチ」ウィンドウを開くには、「ウィンドウ」>「デバッグ」>「ウォッチ」を選択するか、または[Ctrl]-[Shift]-[2]を押します。「ウォッチ」ウィンドウが開きます。

      2. 「ウォッチ」ウィンドウ内の任意の場所でマウスの右ボタンをクリックし、ポップアップ・メニューから「新規ウォッチ」を選択します。「新規ウォッチ」ウィンドウが開きます。

      3. ウォッチ式を入力し、「OK」をクリックします。

これで、デバッグ中に追加の確認を行うことができます。

重要: ウォッチを設定するには、PHPオプションの「デバッグ」タブでウォッチを有効にする必要があります。

  1. 関数内のコードの1行ずつの実行を取り消して、関数コールの次の行まで移動するには、[Ctrl]-[F7]/[⌘]-[F7]を押すか、または「デバッグ」>「ステップ・アウト」を選択します。

  2. 関数内のコードを1行ずつ実行しないで、関数から返される値を取得し、関数コールの次の行まで移動するには、[F8]を押すか、または「デバッグ」>「ステップ・オーバー」を選択します。

  3. デバッグ・セッションを一時休止するには、「デバッグ」>「一時休止」を選択します。

  4. デバッグ・セッションを続行するには、「デバッグ」>「続行」を選択するか、またはcontinue debugging sessionを押します。

  5. デバッグ・セッションを取り消すには、stop debugging sessionを押します。

. プログラムの最後に到達すると、デバッガ・ウィンドウが閉じます。

デバッグ・セッションの例

この項の例では、ステップ・インやステップ・オーバー機能などの基本的なデバッガ機能を示します。また、典型的なデバッガ・ウィンドウの出力も示します。

  1. 次のパラメータで新しいPHPプロジェクトを作成します。

    • プロジェクト・タイプ - PHPアプリケーション

    • ソースの場所 - デフォルトの htdocs フォルダ

    • 実行構成 - ローカルWebサイト PHPプロジェクトの設定については、ドキュメントのPHPプロジェクトの設定を参照してください。

      1. セッション中のホット・キーの使用を有効にするには、カーソルをプロジェクト・ノードに置き、ポップアップ・メニューから「メイン・プロジェクトとして設定」を選択します。

      2. index.php ファイルに次のコードを入力します。

  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>NetBeans PHP debugging sample</title>
    </head>
<body>
<?php
    $m=5;
    $n=10;
    $sum_of_factorials = calculate_sum_of_factorials ($m, $n);
    echo "The sum of factorials of the entered integers is " . $sum_of_factorials;
    function calculate_sum_of_factorials ($argument1, $argument2) {
        $factorial1 = calculate_factorial ($argument1);
        $factorial2 = calculate_factorial ($argument2);
        $result = calculate_sum ($factorial1, $factorial2);
        return $result;
    }
    function calculate_factorial ($argument) {
        $factorial_result = 1;
        for ($i=1; $i<=$argument; $i++) {
            $factorial_result = $factorial_result*$i;
        }
        return $factorial_result;
    }
    function calculate_sum ($argument1, $argument2) {
        return $argument1 + $argument2;
    }
?>
</body>
</html>

このコードには次の3つの関数があります。 * calculate_factorial () 関数 * calcualte_sum () 関数 * calculate_sum_of_factorials () 関数(この関数は、 calculate_factorial 関数を2回コールしてから calcualte_sum () 関数を1回コールし、階乗の和を返します。)

  1. PHPブロックの先頭にブレークポイントを設定します([Ctrl]-[F8]/[⌘]-[F8])。

<?php
  1. デバッグを開始するには、debug main project buttonをクリックします。デバッガがブレークポイントで停止します。

  2. [F7]を3回押します。関数 calculate_sum_of_factorials () をコールしている行でデバッガが停止します。「ローカル変数」ウィンドウに、変数 $m$n 、およびそれらの値が表示されます。

degugger stopped at function call
  1. 関数 calculate_sum_of_factorials() にステップ・インするには、[F7]を押します。デバッガが関数 calculate_sum_of_factorials () 内のコードの実行を開始し、関数 calculate_factorial() のコールで停止します。

call of embedded function

「ローカル変数」ウィンドウに、関数 calculate_sum_of_factorials () 内で宣言されているローカル変数 $argument1$argument2 が表示されます。

variables inside function call another function
  1. [F7]を押します。デバッガが、関数 calculate_factorial() からコードの実行を開始します。「コール・スタック」ウィンドウに、関数へのコールのスタックが逆の順序で表示され、最後にコールされた関数がリストの先頭に表示されます。

call stack
  1. [F7]を押してループにステップ・インします。「変数」ウィンドウに変数の値が表示されます。

local variables inside loop
  1. コードが正常に機能することを確認したら、[Ctrl]-[F7]/[⌘]-[F7]を押して関数の実行を取り消します。プログラムは、関数 calculate_factorial() のコールの次の行に戻ります。 NOTE: プログラムで関数 calculate_factorial() の実行が完了するまでは、[F7]を押すこともできます。この場合も、コールの次の行に戻ります。

call of embedded function second time
  1. 関数 calculate_factorial() が正常に機能することを確認できたため、その実行を省略できます(ステップ・オーバー)。ステップ・オーバーするには、[F8]を押します。プログラムは、関数 calculate_sum() のコールで停止します。

cal of embedded function calculate sum
  1. 関数 calculate_sum() にステップ・インするには、[F7]を押します。

  2. ステップ・オーバーするには、[F8]を押します。いずれの場合も、デバッガは関数 calculate_sum_of_factorials() の最後の行で停止します。

return result
  1. [F7]を押します。デバッガは echo 文の行に移動します。

  2. デバッガがプログラムを終了するまで[F7]を押します。ブラウザ・ウィンドウが開き、プログラムの実行結果が表示されます。

program output

追加ウォッチの使用

プログラムの実行の続きとして追加のウォッチ式を定義できます。これはエラーのキャッチに役立つ場合があります。

警告: 追加のウォッチを設定すると、XDebugが不安定化します。デフォルトでは、ウォッチはデバッグ・オプションで無効になっています。

  1. コードを次のように更新します(プラスをマイナスに置き換えます)。

function calculate_sum ($argument1, $argument2) {return $argument1 - argument2;}

実際には和を求める必要がありますが、間違えてこのように入力したとします。

  1. 「デバッグ」>「新規ウォッチ」を選択するか、または[Ctrl]/[⌘]-[Shift]-[F7]を押します。「新規ウォッチ」ウィンドウが開きます。

  2. 次の式を入力し、「OK」をクリックします。

$factorial1+$factorial2

新しい式が「ウォッチ」ウィンドウに表示されます。

  1. デバッグ・セッションを実行します。デバッガが次の行で停止します。

return $result;

「ウォッチ」ウィンドウ内の式の値と、「ローカル変数」ウィンドウ内の$resultの値を比較します。これらは同一である必要がありますが、現時点では異なります。

watches

この例は非常に単純で、ウォッチ使用の概念を示しています。

PHPとHTMLの混在

PHPとHTMLの両方のブロックを含むコードをデバッグできます。デバッグ・セッションの例の項の例では、値はハードコードされています。値を入力するためのHTML入力フォームをコードに追加します。

  1. <?php?> ブロックの上に次のHTMLコードを追加します。

 <form action="index.php" method="POST">
    Enter the first integer, please:<input type="text" name="first_integer"/>
    <br/>
    Enter the second integer, please:<input type="text" name="second_integer"/>
    <br/>
    <input type="submit" name="enter" value="Enter"/>
 </form>

詳細は、HTML入力フォームを参照してください。

  1. <?php?>ブロックの先頭で、次の行を置き換えます。

$m=5;$n=10;$sum_of_factorials = calculate_sum_of_factorials ($m, $n);echo "The sum of factorials of the entered integers is " . $sum_of_factorials;

次のコードに置き換えます。

if (array_key_exists ("first_integer", $_POST) &amp;&amp; array_key_exists ("second_integer", $_POST)) {$result = calculate_sum_of_factorials ($_POST["first_integer"], $_POST["second_integer"]);echo "Sum of factorials is " . $result;}
  1. ブレークポイントを<?php?>ブロックの先頭に設定し、デバッグ・セッションを開始します。

  2. [F7]を押します。デバッガがプログラムにステップ・インします。ブラウザ・ウィンドウが開きますが、入力フォームは表示されません。Webページが表示される前に、デバッガがページのソース・コード全体を通過する必要があるため、これはデバッガの正常な動作です。実際には、デバッガがコードを2回通過することを意味します。1回目は、HTML入力フォームを表示するコードがデバッガで処理されます。2回目は、デバッガでPHPコードがステップ実行されます。

  3. デバッガがプログラムの終わりに達し、入力フォームが開くまで[F7]を押します。

  4. フォームに入力して[Enter]を押します。デバッグ・セッションは、デバッグ・セッションの例の項に示すように処理を続行します。

[[パス・マッピング、デバッガ・プロキシ、およびカスタムURLでのデバッグ・セッションの開始]]

スクリプトとWebページの両方をデバッグすることは可能で、Webページはローカルまたはリモートのいずれかでデバッグできます。リモートのデバッグの場合、リモート・サーバー上のデバッグされるphpファイルは、ローカル・マシン上で実行中のNetBeans IDEで開いているファイルと同じではありません。したがって、NetBeansのデバッガ・サポートでは、サーバー・パスとローカル・パスをマップできる必要があります。ただし、多くの問題があるため、パス・マッピングは個々のすべてのシナリオについて自動的に解決できるわけではありません。このため、NetBeans 6.7以降では、個々の実行構成に対して、プロジェクトの設定を使用してパス・マッピングを手動で定義できます。また、プロキシ・サーバーを指定したり(ある場合)、デバッグ・セッションが開始するURLを指定することもできます。このURLを指定しない場合、デバッグはインデックス・ファイルから開始します。

パス・マッピングを設定してカスタムのデバッグURLを有効にする

  1. 「プロジェクト」ウィンドウでプロジェクトのノードを右クリックし、コンテキスト・メニューからプロジェクトの「プロパティ」を開きます。

  2. 「プロジェクト・プロパティ」ダイアログで「実行構成」カテゴリに移動します。

  3. 「詳細」ボタンをクリックします。「詳細Web構成」ダイアログが開きます。

  4. パス・マッピング用のサーバー・パスとプロジェクト・パスを追加します。

  5. 「デバッグURL」で、次のいずれかを選択します(デフォルトを選択したままにしないでください)。

    • 毎回聞く: デバッグ・セッションを開始したとき、IDEによってURLの入力が求められます。

    • Webブラウザを開かない: ブラウザを開いてURLを手動で入力するようにユーザーに求めます(GET/POST XDEBUG_SESSION_START変数が必要です)。

      1. デバッグ用のプロキシ・サーバーを使用する場合、「デバッガ・プロキシ」セクションにサーバーのホスト名とポートを入力します。

詳細は、PHP向けのNetBeansブログに投稿されたPHPデバッガでのパス・マッピングを参照してください。

users@php.netbeans.orgメーリング・リストに登録することによって、NetBeans IDE PHP開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。