PHPの出力で付けた覚えがないのにBOM付きになる場合


読むのが面倒な人向けまとめ

狙ってBOM付与してないなら、BOM付与されてるファイルを読み込んでる可能性が高い。

怪しいファイルをfileコマンドとかで片っ端から確認。


基本的には発生する事はないと思いますが、遭遇したのでメモも兼ねて。

JSONファイルがBOM付になってて困ってると連絡がありました。

もちろん付けた覚えもないし、付けようとも思わない。

原因を調べてみたところ、PHPの場合、includeしたファイルがBOM付だと、BOM付として出力してしまうそうです。

原因も分かったところで、コマンド叩いて全ファイルをチェック。

数ファイルがBOM付になってました。

BOMなしに変更したところ、無事BOMなしになりました。

途中参加の案件なので、BOMが付いてしまった経緯はよく分からないですが、狙ってBOMをつけてないはずなので、何かのタイミングでWinのメモ帳で保存してしまったのかな~。

ちなみに、ファイル数が多くて確認していくのが大変って人は↓みたいなPHP書いて実行するといいかも?

<?php
$path = '/var/www';
exec('find ' . $path . ' -type f', $ls);

foreach ($ls as $item) {
    $file = exec('file ' . $item, $file);

    if (preg_match('/.*BOM.*/', $file)) {
        echo 'hit・' . $file;
        echo '<br>';
    }
}

やってることは、指定されたパスでfindコマンドを叩いて、結果をforeachで回しながらfileコマンドでBOM付か確認してます。

BOM付の場合は、そのファイルのパスを出力するので、それを元に確認していってください。