【PHP】変数の内容をファイルに書き出す(デバッグ・ログ)

はじめに

最近はフレームワークを使うことが多いので、デバッグに関しては予め用意されている関数を使ったりしますが、たまに生のPHPを書いている時に変数の中身を知りたい時があります。ページ遷移しない場合は普通にvar_dump()すれば良いですが、ページ遷移する場合やファイルに書き出してしっかり確認したい。あるいはログとして出力したい場合にも使える自作関数をメモしておきます。

方法

コピペできる完成した自作関数を見るにはページ下部へ飛んでください。

ファイル書き出し

まず、テキストをファイルに書き出すにはfile_put_contents()関数を使います。

第1引数に出力先のパス(ファイル名)
第2引数に書き出したいテキスト

file_put_contents("./debug.log", 'Hello World!');

出力先のファイルがまだ存在しない場合は、自動的に作成されます。

変数の展開

テキストデータならそのまま出力できますが、配列やオブジェクトなどの場合は、一旦テキストデータに変換する必要があります。

変数の展開にvar_dump()を使いたいですが、そのまま使うとその場で展開されてしまうので、一旦出力をバッファしておかなければいけません。

以下のようにすることでバッファリングできます。

ob_start();
var_dump($data);
$dump = ob_get_contents();
ob_end_clean();

自作デバッグ関数

上記の内容を踏まえて、関数にすると以下のようになります。

function myDebug($data)
{
    ob_start();
    var_dump($data);
    $dump = ob_get_contents();
    ob_end_clean();
    file_put_contents("./debug.log", $dump);
}

追記していく場合

出力内容を上書きではなく、追記していく場合は、file_put_contents()関数の第3引数FILE_APPENDを渡します。

file_put_contents("./debug.log", $dump, FILE_APPEND);

完成した自作関数

出力した時の時間も必要だったりするので、以下のような仕上がりにしてみました。

function myDebug($data)
{
    $time = new DateTime('now', new DateTimeZone('Asia/Tokyo'));

    ob_start();
    echo '------------------------------', PHP_EOL;
    echo $time->format('Y年m月d日 H時i分s秒'), PHP_EOL;
    echo '------------------------------', PHP_EOL;
    var_dump($data);
    $dump = ob_get_contents();
    ob_end_clean();
    file_put_contents("./debug.log", $dump, FILE_APPEND);
}

使い方

以下のように関数を呼び出すだけで出力されるので便利です。

$data = [
    'name' => '山田太郎',
    'tel' => '090-xxxx-xxxx',
    'age' => '24',
];

myDebug($data);

出力結果

------------------------------
2022年10月16日 12時14分29秒
------------------------------
array(3) {
  ["name"]=>
  string(12) "山田太郎"
  ["tel"]=>
  string(13) "090-xxxx-xxxx"
  ["age"]=>
  string(2) "24"
}