在收到通知/警告时停止脚本执行

2022-08-30 11:01:57

是否有可能让PHP在收到通知/警告时在全球范围内停止执行?

我们运行一个开发服务器,上面有很多网站,但希望迫使我们的开发人员修复这些警告/通知(或至少寻求帮助),而不是忽略并继续前进。


答案 1

是的,这是可能的。这个问题谈到了如何处理PHP中的错误的更普遍的问题。您应该使用set_error_handler文档来定义和注册自定义错误处理程序,以自定义 PHP 错误的处理。

恕我直言,最好对任何PHP错误抛出异常,并使用try/catch块来控制程序流,但在这一点上意见不同。

要实现OP的既定目标,您可以执行以下操作:

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');

上面的代码将在引发 或 时引发 ,从而有效地终止脚本输出(如果未捕获异常)。在 PHP 错误上抛出异常最好与并行异常处理策略 (set_exception_handler) 结合使用,以便在生产环境中正常终止。ErrorExceptionE_NOTICEE_WARNING

请注意,上面的示例将不考虑错误抑制运算符。如果这对您很重要,只需使用函数添加一个检查,如下所示:@error_reporting()

function errHandle($errNo, $errStr, $errFile, $errLine) {
    if (error_reporting() == 0) {
        // @ suppression used, don't worry about it
        return;
    }
    // handle error here
}

答案 2

您可以在 php.ini 文件Docs 中全局配置它。

这可以通过指定一个文件来完成,该文件由所有PHP进程使用auto_prepend_file指令Docs包含

auto_prepend_file "/full/path/to/a/prepend-file.php"

在全局 php.ini 文件中执行此操作将确保始终执行预置文件中的代码。然后使用它来注册一个全局错误处理程序,该处理程序将所有错误转换为异常文档

<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

这个小脚本会把所有错误/警告/通知等变成一个ErrorException

此代码示例可能太短(将在下面进一步注释),因此不要错过set_error_handler()Docs手册页上的示例

将其与error_reporting ini 指令Docs 结合使用,这些值在 php.ini 文件中描述(或者作为另一个选项,使用第二个参数按严重性处理错误)。set_error_handler

抛出异常是一件非常严格的事情。您的程序员将被迫处理警告和错误,否则代码将无法正常工作(包括使用@ error control运算符的代码中的那些,使其无效)。

可能这太多了,在公司内部不被社会所接受。相反,您还可以通过使用输出缓冲来记录所有错误并将它们添加到输出的末尾(或顶部,使其更明显)。

创建(但不引发)错误异常已经捕获了回溯跟踪,这在错误处理中非常有用。

显示错误和警告的另一种方法是将它们记录到日志文件中,然后使用另一个进程监视该文件并聚合信息。您可以创建一个记分牌,显示每个应用程序的警告数量,并在办公室中显示此内容,以便每个人都能看到团队的表现或类似的乐趣。

我想说的是:除了技术问题之外,这是一个社会问题,你需要创造性地处理,并真正向你的开发人员提出问题。您需要明确为什么修复警告和错误很重要,以及他们的编码和技能将如何从中受益。


推荐