どこでブラウザへの出力をしてしまったのかチェック
PHPの超便利関数を見つけたのでメモ。
headers_sent関数がそれ。
header関数を使おうと思ったら「headers already sent」なんていわれることがあるわけだが、この関数を使うと「もう何か出力したかどうか」をチェックすることができる。しかしこの関数のもっとすごいところは・・・どのファイルの何行目で出力があったのか教えてくれる点だ。
通常スクリプトを書くときは共通の処理を外部ファイルとするわけで、ある程度の規模になってくると当然ひとつの処理を実行するのにいくつものファイルをincludeすることが多々ある。こんなときに「headers already sent」なんていわれた日には、それこそ手当たり次第にrequireしているファイルを開いてチェックしなければならない。
しかしこの関数を使うと、どこで出力があったかわかってしまうのだ。実際には以下のように使用する。
bool headers_sent([string &file [, int &line]])
引数なしで使うと出力があったかどうかを判別するだけ。
第一引数を渡すと、すでに出力があった場合に、その第一引数の変数に出力があったファイル名を代入してくれる。さらに第二引数を渡すと、出力のあった行番号も代入してくれる。header関数で悩んでしまったら以下のようなスクリプトをheader関数の直前にでも入れてチェックすると、手っ取り早く出力箇所を特定できる。
if(headers_sent($fileName,$lineNumber)){
exit(‘File Name: ‘.$filename.'(‘.strval($lineNumber).’)’);
}
まだまだ知らない関数がたくさんありそうだ。