5

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

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

我很确定这可以用一个 PHP 模块来完成,但我从来没有写过一个,也不知道从哪里开始。

4

2 回答 2

3

在 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 上并且不能执行匿名函数,则需要使用回调。)

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

于 2010-06-07T18:40:18.833 回答
1

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

于 2010-06-07T20:12:09.930 回答