我正在使用一款大型的第三方php软件,它存在许多错误需要我去修复。但是这个过程非常困难,因为它使用了很多错误抑制符号@,例如@include 'brokenfile.php';
,这会导致php停止运行而没有显示任何错误信息。所以我看到的只是一个空白页面,无法获得任何信息。我该如何强制php显示错误信息,即使它们被“抑制”了呢?
我正在使用一款大型的第三方php软件,它存在许多错误需要我去修复。但是这个过程非常困难,因为它使用了很多错误抑制符号@,例如@include 'brokenfile.php';
,这会导致php停止运行而没有显示任何错误信息。所以我看到的只是一个空白页面,无法获得任何信息。我该如何强制php显示错误信息,即使它们被“抑制”了呢?
scream
的扩展,可以禁用调试中的 @
操作符。安装该扩展并在您的 php.ini 中启用它即可:scream 扩展提供了禁用错误控制运算符以便报告所有错误的可能性。此功能由 ini 设置控制。
scream.enabled = On
备选方案:
最近的 xdebug 版本也提供了此功能。您需要安装并设置 xdebug。
xdebug.scream = On
在php.ini中
使用小型shell命令可以递归地从代码中删除所有的"@":
find . -type f | xargs perl -pi -e 's/^@|(\s)@/$1/g'
find . -type f | xargs perl -pi.bkp -e 's/^@|(\s)@/$1/g'
perl -e "s/FIND/REPLACE/g;" -pi.bkp $(find path/app -type f)
- Valery Viktorovsky快速而不太规范的解决方案:您可以在整个项目中进行查找和替换,只需删除所有在其前面有空格的 @ 符号即可。在 Netbeans 中,您可以使用 Ctrl+H
来实现这一点。您要搜索的模式应该是 " @"(空格和 at 字符)。
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline )
{
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
function catchException($e)
{
if (error_reporting() === 0)
{
return;
}
// Do some stuff
}
set_exception_handler('catchException');
?>
如果您使用 set_error_handler() 设置了自定义错误处理函数,则该函数仍将被调用,但是这个自定义错误处理程序可以(并且应该)调用 error_reporting(),当触发错误的调用之前带有 @ 时,它将返回 0。
参考:错误控制运算符