是否有可能在通知/警告有PHP停止执行,在全球范围?
我们运行了很多网站的开发服务器,但要强迫我们的开发人员来解决这些警告/通知(或至少与他们寻求帮助),而不是忽略并继续前进。
是否有可能在通知/警告有PHP停止执行,在全球范围?
我们运行了很多网站的开发服务器,但要强迫我们的开发人员来解决这些警告/通知(或至少与他们寻求帮助),而不是忽略并继续前进。
对的,这是可能的。 这个问题说话如何在PHP处理错误更普遍的问题。 你应该定义和注册使用自定义错误处理程序set_error_handler
文档定制处理的PHP错误。
恕我直言,这是最好的抛出异常的任何PHP错误和使用try / catch块来控制程序流程,但意见在这一点上有所不同。
为了完成业务方案的既定目标,你可能会做这样的事情:
function errHandle($errNo, $errStr, $errFile, $errLine) {
$msg = "$errStr in $errFile on line $errLine";
if ($errNo == E_NOTICE || $errNo == E_WARNING) {
throw new ErrorException($msg, $errNo);
} else {
echo $msg;
}
}
set_error_handler('errHandle');
上面的代码将抛出ErrorException
任何时间E_NOTICE
或E_WARNING
升高时,有效地终止脚本输出(如果该异常没有被捕获)。 对PHP错误抛出异常最好用平行的异常处理策略(组合set_exception_handler
),以在生产环境中正常终止。
需要注意的是上面的例子也不会尊重@
错误抑制操作。 如果这对你很重要,简单地用增加一个检查error_reporting()
函数,如下所示:
function errHandle($errNo, $errStr, $errFile, $errLine) {
if (error_reporting() == 0) {
// @ suppression used, don't worry about it
return;
}
// handle error here
}
您可以在全球范围内的配置此php.ini文件文档 。
您通过指定被包括通过与所有PHP进程的一个文件auto_prepend_file
指令文件 :
auto_prepend_file "/full/path/to/a/prepend-file.php"
这样做,你内心全球php.ini文件,将确保前置文件中的代码将被永远exectued。 您可以使用它,然后注册一个全局错误处理程序,将关闭所有的错误到异常文件 :
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
这个小脚本将关闭所有的错误/警告/告示等为ErrorException
。
与结合它error_reporting
INI指令文件 ,该值是描述在php.ini文件。
抛出异常是一个非常严格的事情。 你的程序员将被迫处理警告和错误,否则代码不会无法正常工作。
也许这是太多的程序员和公司内部不为社会所接受。 相反,你也可以记录所有的错误,并在输出年底通过使用输出缓冲的将它们添加(或在顶部,这样它更明显)。
另一种方法是记录错误和警告日志文件,然后监视另一个进程的文件和汇总信息。 你可以创建一个显示每个应用程序的警告数的记分牌,并在办公室这个可见,所以大家看到一个团队如何执行或一些有趣的那样。
我尽量说的是:接下来的技术问题,这是你需要有创造性与实际上谈的问题出你开发一个社会问题。 你需要弄清楚它为什么修复警告和错误,以及如何他们的编码和技能会从中受益是非常重要的。
由于PHP 5.3.0的:
set_error_handler(
function(int $nSeverity, string $strMessage, string $strFilePath, int $nLineNumber){
if(error_reporting()!==0) // Not error suppression operator @
throw new \ErrorException($strMessage, /*nExceptionCode*/ 0, $nSeverity, $strFilePath, $nLineNumber);
},
/*E_ALL*/ -1
);
如果你是在开发环境中,你可能会考虑安装模块的Xdebug并设置xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE
在你的PHP INI文件的某处。 开发人员可以重置xdebug.halt_level
,但我们有同样的问题,基于答案set_error_handler
,因为我们可以将处理器恢复到其原始值。
其他的解决方案实现它覆盖默认的错误日志机制自定义错误处理程序。 这意味着,当我们设置自定义错误处理程序,通知/警告未在默认方式了印刷,所以我们改变的不仅仅是“停经通知/警告脚本执行”更多。
但是,我需要一种方法来打印还是消息 - 在我的PHP CLI的情况下 - 由于输出继而被另一个程序解析。 所以,我不希望以某种方式 ,但完全相同的方式比PHP通常不会它打印的消息。 我只是想用的退出代码停止 PHP CLI过程!= 0
之后印刷的通知/警告,并不会改变任何东西 。
不幸的是,似乎没有要退出脚本但不改变整个错误处理的默认方式。 所以,我需要重新实现在PHP默认的错误处理程序(这是用C实现的)。
对于这一点,我看着在PHP源代码的默认错误打印机制和移植自C相关件PHP获取下面的错误处理程序,这是我希望的情况下,与大家分享你需要类似的东西:
set_error_handler(
function($errNo, $errStr, $errFile, $errLine) {
$error_type_str = 'Error';
// Source of the switch logic: default error handler in PHP's main.c
switch ($errNo) {
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
$error_type_str = "Fatal error";
break;
case E_RECOVERABLE_ERROR:
$error_type_str = "Recoverable fatal error";
break;
case E_WARNING:
case E_CORE_WARNING:
case E_COMPILE_WARNING:
case E_USER_WARNING:
$error_type_str = "Warning";
break;
case E_PARSE:
$error_type_str = "Parse error";
break;
case E_NOTICE:
case E_USER_NOTICE:
$error_type_str = "Notice";
break;
case E_STRICT:
$error_type_str = "Strict Standards";
break;
case E_DEPRECATED:
case E_USER_DEPRECATED:
$error_type_str = "Deprecated";
break;
default:
$error_type_str = "Unknown error";
break;
}
fwrite(STDERR, "PHP $error_type_str: $errStr in $errFile on line $errLine\n");
exit(1);
},
E_ALL
);
您可以打开的error_reporting在您的服务器的PHP配置文件为E_ALL。
在PHP 5中新的错误级别E_STRICT是可用的。 随着E_STRICT不包括内E_ALL你必须明确地允许这种错误的水平。 在开发阶段启用E_STRICT会有一些好处。 严格的信息将帮助您使用编码的最新和最伟大建议的方法,例如警告你使用废弃的函数。
参考: PHP配置手册
以下设置引导你到输出的所有错误中的脚本。 请注意,这些都需要纳入你的所有脚本文件的开始。
<?php
// Turn off all error reporting
error_reporting(0);
// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);
// Report all PHP errors (see changelog)
error_reporting(E_ALL);
// Report all PHP errors
error_reporting(-1);
// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
?>