我遵循良好的编程习惯,我将PHP错误记录到文件而不是将其显示给用户。我使用set_error_handler()
。
现在问题。例如,我有一个地方:
@file_exists('/some/file/that/is/outside/openbasedir.txt');
但是尽管有错误抑制操作符,错误消息仍会记录。我不希望这样。我希望压缩错误不要传递给我的错误处理程序。
答案 0 :(得分:26)
@
运算符临时将error_reporting设置为0,因此您可以在错误处理程序中测试error_reporting的值:
if (ini_get('error_reporting') == 0) {
return;
}
甚至更好,只记录error_reporting中的错误类型:
$error_reporting = ini_get('error_reporting');
if ( !($error_reporting & $errno) ) {
return;
}
另请查看log_errors
和error_log
选项,以便自动将错误记录到文件或syslog中。
答案 1 :(得分:3)
也适用于PHP 7的解决方案
根据PHP文档:
如果您已使用set_error_handler()设置了自定义错误处理程序函数,则该函数仍将被调用,但是此自定义错误处理程序可以(并且应该)调用error_reporting(),该函数将在触发触发错误的调用之前返回0通过@。
来源:http://php.net/manual/en/language.operators.errorcontrol.php
因此,您可以在错误处理程序中使用以下代码:
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
if (error_reporting() == 0) {
/// @ sign temporary disabled error reporting
return;
}
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
答案 2 :(得分:1)
您实际上应该避免使用@
运算符。首先,它很慢,我甚至称之为有害。
你应该拥有的php.ini
文件中有两行:
error_repoting = E_ALL | E_STRICT
display_errors = Off
...或者,如果您无法访问php.ini文件,那么在index.php(或任何其他引导程序文件)的顶部,您应该添加:
error_reporting( E_ALL | E_STRICT );
ini_set('display_errors', 0);