PHP自定义错误页面

Sho*_*hoe 5 php error-handling

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

现在,我们要考虑2个案例:

  1. 该站点处于调试模式
  2. 该站点未处于调试模式

现在,对于案例#1:

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

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
Run Code Online (Sandbox Code Playgroud)

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

相反,如果案例是#2:

我们希望能够停用消息:

ini_set('error_reporting', 0);
ini_set('display_errors', 0);
Run Code Online (Sandbox Code Playgroud)

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

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

现在另一个:

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

dev*_*ler 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;
Run Code Online (Sandbox Code Playgroud)