log_errors を off としているのに、 PHP のエラー出力が行われる
環境
- PHP 5.4
発生した事象
PHP で作成したコマンドラインアプリケーションにおいて、「Warning: Division by zero」のゼロ除算エラーが発生した。
このアプリケーションでは、 “log_errors“ の設定を “off“ にすることで、エラー出力がされないことを保証していた。具体的には、 ini_set('log_errors', false);
の文をコードに含めていた。
にも関わらず、以下のようにエラーの内容が出力された。
Warning: Division by zero in - on line ...(略)
原因
“log_errors” の設定は “off” であったが “display_errors” の設定が “on” となっており、これによってエラーの内容が標準出力されていた。
# cat a.php
<?php
echo 'start' . PHP_EOL;
var_dump(1 / 0);
echo 'end' . PHP_EOL;
このスクリプトを、 "display_errors" を "on" に設定して実行すると以下のような出力が行われる。
# php -d 'log_errors=off' -d 'display_errors=on' a.php
start
Warning: Division by zero in /root/work/a.php on line 3
bool(false)
end
なお、「Warning ~」の出力は標準出力 (stdout) に出力されている。
# php -d 'log_errors=off' -d 'display_errors=on' a.php 1> /dev/null
“log_errors” についても “on” にしてコードを実行すると、以下のように同じエラーが二つ出力される形となる。
「PHP Warning: ~」が “log_errors” のものであり、「Warning: ~」が “display_errors” のものである。
# php -d 'log_errors=on' -d 'display_errors=on' a.php
start
PHP Warning: Division by zero in /root/work/a.php on line 3
Warning: Division by zero in /root/work/a.php on line 3
bool(false)
end
なお、「PHP Warning: ~」の “log_errors” の出力は、標準エラー出力に出力されている。
# php -d 'log_errors=on' -d 'display_errors=on' a.php 2> /dev/null
start
Warning: Division by zero in /root/work/a.php on line 3
bool(false)
end
error_log ディレクティブの設定について
"log_errors" で有効化されたエラーがどこに出力されるかは、 "error_log" ディレクティブで設定される。
環境を確認したところ、 “error_log” の設定はされていなかった。
If this directive is not set, errors are sent to the SAPI error logger. For example, it is an error log in Apache or stderr in CLI.
とあった。 “log_errors” を “on” に設定すると標準エラー出力されるのは、コマンドライン実行であり、かつ “log_errors” ディレクティブの設定がされていなかったためであると思われる。