<PHP>ログを出力する
勉強記録
現在リモートワーク中です。
我が家にはエンジニア歴10年の夫がいまして、私に勉強を教えてくれたりいろいろとアドバイスをしてくれています。
先日、仕事をしているとバグを発見。
どこでバグが起こっているのかなかなか見つけれらずにいると、夫から「ログを出力して処理がどうなっているのか見てみるといいよ」とのことで、ログを出力するところまでやってみたのでまとめました。
ログの出力
まず、ただ単にログを出力するためだけのコードを書いてみました。
以下のコードを実行すると、php_logtest.logというファイルができて「logtest」と書き込まれます。
<?php $f = fopen('php_logtest.log','a'); fwrite($f,"logtest\n"); fclose($f);
流れとしては、
・fopen()でファイルを開く
・fwrite()で書き込む
・fclose()でファイルを閉じる
という流れです。
fopen関数
第一引数はファイル名、第二引数はモードです。
今回ログに書き出したかったので、モードは'a'にしました。
’a'にすると、ファイルは書き出し用としてオープンされ、ファイルポインタをファイルの終端に置きます。(ファイルが存在しない場合は、新規作成を試みます)
書き込みは常に追記となります。
ファイルのオープンに成功するとファイルポインタリソースを返します。(失敗するとfalse)
ファイルポインタリソースは、ファイルをどこまで読んだか、どこまで書いたかを示す場所...という感じです。
今回はこの戻り値を$fに入れています。
このようにファイルを読み込んだり書き込んだりしたいときには、まずfopen関数でファイルをオープンする必要があります。
fwrite関数
第一引数は、fopen関数で作成したファイルポインタリソースです。
今回は$fに代入したので、第一引数は$fとなっています。
第二引数は、書き込みたい文字や変数をしていします。
fclose関数
オープンされたファイルポインタをクローズするための関数です。
引数にクローズしたいファイルポインタリソースを渡すので、今回は$fを渡しています。
実際に問題のコードに書いてみる
今回は問題のコードでは、どこかが無限ループを起こしていたので、どのように処理が走っているのかログに出力してみました。
問題のコードの先頭らへんにfopen関数を、処理が終わるところにfclose関数を、for文で回しているところにfwrite関数を追記しました。
fwrite関数の第二引数に中身をみたい変数名を入れていって、処理がどのようになっているかログに書き出すことで、修正部分を見つけました!(語彙力が・・・笑)
いつも、var_dumpとかを使ってデバッグをしていたのですが、今回自分でログに書き出してデバッグするという方法を学びました。
これからはどんどん活用していきたいと思います!