PHPのデバッグ方法を分かりやすく解説


PHPのデバック方法を分かりやすく解説していきます。
「var_dump」で画面に出力する方法ではなく、エラー内容や処理の流れをログファイルに出力する方法になります。
ログファイルに出力する事で、実装した処理が正常に動作しているか確認できたり、不具合の原因を特定できたりします。

準備

まずは下記のファイルを用意します。

・sample.php・・・・・・デバッグをしたいファイル
・functions.php・・・・・php.iniの設定やデバッグ関数を記述するファイル

デバッグをしたいファイルの上部でfunctions.php を読み込んでおきます。

sample.php

// functions.php を読み込み
require('functions.php');

ログの出力設定

functions.phpにログの設定を記述します。
ini_setとはPHPの設定をいじることができる関数です。

出力するエラーレベルに関しては公式ドキュメントを参考にして下さい。
https://www.php.net/manual/ja/function.error-reporting.php

functions.php
//================================
// ログ
//================================
//エラー表示/非表示の設定
ini_set('log_errors','on');
//エラーレベルを設定
ini_set('error_reporting', E_ALL);
//ログの出力ファイルを指定
ini_set('error_log','php.log');

とりあえずこれだけでもエラーがあった場合にログファイルが自動生成され、原因をつきとめる事ができます。

例えばこんな感じです。
下記の場合だと「Undefined variable」なので、変数が定義されていないというエラーになります。

php.log
[03-Jan-2020 17:38:07 Asia/Tokyo] PHP Notice:  Undefined variable: options in /Users/ray/Dropbox/05_mamp/htdocs/example/functions.php on line 195
[03-Jan-2020 17:38:07 Asia/Tokyo] PHP Notice:  Undefined variable: mail in /Users/ryu/Dropbox/05_mamp/htdocs/example/functions.php on line 73

よくあるエラーメッセージ

エラーメッセージ 説明
Fatal error: Call to undefined function 定義していない関数を呼び出しています。
Parse error: syntax error, unexpected end of file, expecting ‘,’ or ‘;’ あるべき文字が抜けています。
Fatal error: [] operator not supported for strings 文字型の変数を配列として扱おうとしています。
Warning: Missing argument 2 for (関数名) 関数に必要な引数が省略されています。

デバッグの方法

function.phpにデバッグ関数を記述。

functions.php
//================================
// デバッグ
//================================
//デバッグフラグ
$debug_flg = true;
//デバッグログ関数
function debug($str){
  global $debug_flg;
  if(!empty($debug_flg)){
    error_log('デバッグ:'.$str);
  }
}

例えばこのようなプログラムがあったとします。

sample.php
if(true){
    //処理A
    debug("処理Aが成功しました");
    //処理B
    debug("処理Bが成功しました");
}else{
    //処理C
    debug("処理Cが成功しました");
    //処理D
    debug("処理Dが成功しました");
}
debug("処理終了");

php.logにはこのように出力されプログラムの処理を追う事ができます。

php.log
[03-Jan-2020 18:49:16 Asia/Tokyo] デバッグ:処理Aが成功しました
[03-Jan-2020 18:49:16 Asia/Tokyo] デバッグ:処理Bが成功しました
[03-Jan-2020 18:49:16 Asia/Tokyo] デバッグ:処理終了

変数の値を分かりやすくログに表示する方法

print_r とは、指定した変数に関する情報を解りやすく出力する関数です。
第二引数にtrueを入れる事で戻り値として結果を表示させる事ができます。

php.log
$array = array(
    '野菜' => 'キャベツ',
    '果物' => 'りんご',
    '飲み物' => 'コーラ',
);

debug(print_r($array,true));

php.logではこのように分かりやすく表示されます。
DB接続時や、セッションの中身の確認する際に便利です。

php.log
[03-Jan-2020 19:03:09 Asia/Tokyo] デバッグ:Array
(
    [野菜] => キャベツ
    [果物] => りんご
    [飲み物] => コーラ
)



以上PHPのデバッグ方法に関する解説でした。
記載内容に誤りがあったら、ご指摘いただけると助かります。