【问题标题】:Logging fatal/parse errors in PHP5在 PHP5 中记录致命/解析错误
【发布时间】:2011-02-15 21:26:13
【问题描述】:

我正在编写一个错误记录服务,该服务将集成到我服务器上运行的网站中,它将通过电子邮件向我发送错误批次等。

所以我一直在尝试找出是否有办法处理致命错误和解析错误,但没有使用 PHP 代码中的技巧(输出缓冲区、关闭函数)来处理它。我很高兴在我的 PHP 代码之外编写一些 C 代码或其他东西来处理它。如果可能,我还想发出重定向(我的网站使用输出缓冲,因此不应该发送任何标头)。

我很确定这可以通过 PHP 模块完成,但我从未编写过,也不知道从哪里开始。

【问题讨论】:

    标签: php fatal-error error-logging parse-error php-extension


    【解决方案1】:

    没有办法捕捉 PHP 中的致命错误或解析错误。但是..

    在 5.2 中,他们添加了error_get_last()。您可以在关闭函数中调用它并执行日志记录。一个未经测试的 5.3 示例,用于在出现致命错误时触发邮件:

    <?php
    register_shutdown_function(function(){
        $err = error_get_last();
        if(is_array($err) && array_key_exists('type', $err) $err['type'] > 0 
          && ($err['type'] == E_ERROR || $err['type'] == E_PARSE) {
            error_log("Oh noes, a fatal: " . var_export($err, true), 1, 'fatals@example.com');
        }
    });
    

    (如果您不在 5.3 上并且无法执行匿名函数,则需要使用回调。)

    不幸的是,由于这是在关闭函数中处理的,因此可能已经发出了标头,并且您可能无法为用户提供任何有用的信息。不过,这取决于应用程序的其余部分,因此它可能适合您。试试就知道了!

    【讨论】:

    • 我在我的问题中明确表示我并不想使用那些 PHP 技巧来捕捉错误,我只需要记录它们并以某种方式处理它们。使用 PHP 模块似乎是最有可能的方式,但我找不到太多关于 PHP 模块中的错误处理的信息。
    • 我在回答中也明确表示你抓不到,但你可以登录。 :)
    【解决方案2】:

    默认情况下,所有错误都会传递到 Web 服务器错误日志,但您可以在 php.ini 中通过指定您自己的文件 via error_log setting 的路径来更改它。所以剩下要做的就是编写一些单独的脚本/应用程序来每天解析/发送数据/截断日志文件/无论如何并将其作为cron作业运行。

    【讨论】:

    • 唯一的问题是我无法发出重定向。我认为使用 PHP 模块我可以做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2012-03-08
    • 2017-08-22
    • 2012-08-24
    • 2019-06-17
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多