コンテンツにスキップ

デバッグの豆知識@PHP

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. デバッグのプラクティス

var_dumpメソッドでデータの中身を確認

▼ 基本形

ブラウザの『デベロッパーツール>Network>出力先ページのPreviewタブまたはResponseタブ』で確認できる。

*実装例*

<?php

var_dump($var);

▼ 例外処理との組み合わせ

ブラウザのデベロッパーツール>Network>出力先ページのPreviewタブで例外エラー画面が表示される。

エラー画面の上部で、var_dump($var)の結果を確認できる。

*実装例*

<?php

throw new \Exception(var_dump($var));


var_dumpメソッドの結果が表示されない

▼ 処理の通過地点の特定

処理がvar_dumpメソッドを通過していないことが原因。任意の場所にvar_dump("文字列")を記述し、どこに記述した時に文字列が出力されるか否かを確認する。

*実装例*

<?php

if ($foo = 1){
  return 1;
}

if ($foo = 2){
  var_dump("文字列"); // echo "文字列" でも良い。
  return 2;
}

if ($foo = 3){
  return 3;
}


500ステータスの位置を特定できない

▼ エラー箇所の特定

任意の場所にexitメソッドを記述し、どこに記述した時に、500ステータスが起こらずに処理が完了する (レスポンス無し) か否かを確認する。

*実装例*

<?php

if ($foo = 1){
  return 1;
}

if ($foo = 2){
  exit(); // エラー箇所前でexit()をすると500エラーは起こらない
  return 2;
}

if ($foo = 3){
  return 3; // ここでエラーが起こっているとする
}

▼ 文字コードの修正

文字コードが異なっていることが原因。

以下を、var_dumpメソッドよりもダウンストリームに追加する。

<?php
header("Content-Type: text/html; charset=UTF-8");


02. Xdebugによるデバッグ

セットアップ

1. ローカル仮想環境に対するインストール

ローカル仮想環境で以下のコマンドを実行。

$ sudo pecl install xdebug-2.2.7

2. Xdebugの設定

Xdebugのあるローカル仮想環境から見て、PhpStromビルトイン仮想環境を接続先と見なす。

zend_extension=/usr/lib64/php/modules/xdebug.so

xdebug.default_enable=1
# リモートデバッグの有効化。
xdebug.remote_enable=1

# DBGプロトコル
xdebug.remote_handler=dbgp

# エディタ仮想環境のプライベートIPアドレス。
xdebug.remote_host=10.0.2.2

# エディタ仮想環境で開放するポート番号。
xdebug.remote_port=9001

# 常にデバッグセッションを実行。
xdebug.remote_autostart=1

# DBGpハンドラーに渡すIDEキーを設定。
xdebug.idekey=PhpStorm

3. ローカル仮想環境を再起動

$ service httpd restart

4. PhpStormビルトインの設定


デバッグにおける通信の仕組み

1. エディタ仮想環境の作成

エディタは仮想サーバーを作成し、9000番ポートを開放する。

2. エディタからデバッガーエンジンに対するリクエスト

デバッガーエンジン (Xdebug) は80番ポートを開放する。

エディタ仮想環境はこれに対して、セッション開始のリクエストをHTTPプロトコルで送信する。

3. デバッガーエンジンから仮想環境に対するリクエスト

デバッガーエンジン (Xdebug) はセッションを開始し、エディタ仮想環境の9000番ポートに対して、レスポンスを返信する。

4. Breakpointの設定

エディタ仮想環境は、デバッガーエンジンに対して、Breakpointを設定するリクエストを送信する。

5. DBGプロトコル:Debuggerプロトコルによる相互通信の確立

DBGプロトコルを使用して、エディタ仮想環境とデバッガーエンジンの間の相互通信を確立する。

6. 相互通信の実行

エディタは、デバッガーエンジンに対してコードを送信する。

デバッガーエンジンは、Breakpointまでの各変数の中身を解析し、エディタ仮想環境に返信する。

Xdebug仕組み