PHP自定义错误页面

时间:2011-02-17 19:12:10

标签: php error-handling

每个人都说在活动网站中“显示启用错误”是不好的(由于某些安全问题)。

现在,我们必须考虑两种情况:

  1. 网站处于调试模式
  2. 网站未处于调试模式
  3. 现在,对于案例#1:

    我们希望看到错误。怎么样?

    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', 1);
    

    没有更简单的了。我们还可以为除Parse和Fatal之外的所有错误定制错误处理程序。

    相反,如果案例是#2:

    我们希望能够停用消息:

    ini_set('error_reporting', 0);
    ini_set('display_errors', 0);
    

    没关系。但是如何向用户展示一个友好的信息,比如“嘿嘿,有些东西真的很有用。我不保证你我们正在努力修复它,因为我们非常懒惰。” 您应该再次启用错误并使用函数set_error_handler()并希望不会发生解析或致命错误。但我的第一个问题是:

      

    问题1 :是否可以避免错误报告并在出现问题时加载自定义脱机页?我的意思是,是否可以让ini_set('error_reporting', 0);ini_set('display_errors', 0);仍然能够告诉PHP加载自定义错误页面?

    现在是另一个:

      

    问题2 :我开发了一个具有set_error_handler()日志功能的数据库中出现错误的类。通过这种方式,我可以跟踪黑客企图和其他很酷的东西。 (是的,我总是确定数据库是可访问的,因为如果我们无法连接到数据库,我的应用程序将关闭)。这值得吗?

2 个答案:

答案 0 :(得分:5)

前段时间我创建了一个小系统,当发生致命错误/抛出未捕获异常时,会将您重定向到错误页面。可以假设,每个请求都由一个文件处理并在此文件中结束,因此通过到达此文件的末尾,我确信一切都正常。在这种情况下,我设置了在错误页面上重定向的功能并将其注册为关闭功能 - 因此它将在所有请求结束时被调用。现在在这个函数中,我检查干净关闭的条件,如果满足,我什么都不做,输出被刷新到浏览器,否则缓冲区被清除,只有标题重定向到错误页面。

此代码的简化版本:

<?php
function redirect_on_error(){
    if(!defined('EVERYTHING_WENT_OK')){
        ob_end_clean();
        header('Location: error.html');
    }
}

register_shutdown_function('redirect_on_error');

ob_start();

include 'some/working/code.php';

echo "Now I'm going to call undefined function or throw something bad";

undefined_function();
throw new Exception('In case undefined function is defined.');    

define('EVERYTHING_WENT_OK', TRUE);
exit;

答案 1 :(得分:0)

  

问题1:这是否可以避免错误报告并在出现问题时加载自定义脱机页面?

不幸的是,我不这么认为,至少对于致命的错误。但是,最新版本的PHP总是在发生时发送500响应,因此,根据Web服务器,如果发生这种情况,您可能能够重写响应。如果运行PHP的实际服务器位于反向代理之后,那么Apache就变得微不足道了。

  

问题2:我开发了一个具有set_error_handler()功能的类,记录数据库中发生的错误。

当然,记录错误总是好的。您似乎已经意识到将错误记录到数据库中的限制。