通过自定义错误页面处理 PHP / mysql 错误(包括致命错误)

Posted

技术标签:

【中文标题】通过自定义错误页面处理 PHP / mysql 错误(包括致命错误)【英文标题】:Handling PHP / mysql errors (including fatal) via custom error page 【发布时间】:2013-11-26 10:48:17 【问题描述】:

处理前端网站错误的最佳方法是什么?类似于 twitter、reddit 等,它们有一个很好的“出错了”页面。我想:

    检测错误并得到通知,即使它只是一个日志文件 显示自定义错误页面,例如失败鲸或类似页面,因此其 明显出了问题,而不是什么也没显示,或者看起来很可怕。

理想情况下,任何阻止用户查看站点的内容,例如致命错误、自定义异常、mysql 关闭、随机 500 错误等,都应该显示自定义错误页面。

致命错误

php : Custom error handler - handling parse & fatal errors - 工作正常,但如果这发生在脚本末尾,并且它已经输出了一些东西,这将不起作用

非致命错误

http://davidwalsh.name/custom-error-handling-php

MySQL 错误

理想情况下需要涵盖从简单的查询错误到服务器不存在的所有内容。想象一下它就像检测我的数据库类中的错误并调用重定向到/调用错误方法一样简单

服务器错误

这是我应该在 PHPApacheboth 中做的事情吗?

目前的代码

目前我有以下各种其他 SO 的混合,但只有在页面的其余部分加载后才会报告致命错误。

任何人对可以与上述所有内容一起使用的东西有任何想法吗?

<?
function xhandler($number,$string,$file,$line,$context)

    //log to text file?
    //log to xml file?
    //store in database?
    //whatever you want to do!

    echo "<h1>here be dragons!</h1>";
    echo "$number,$string,$file,$line,$context";
    exit();


function fatal_handler() 
    $errfile = "unknown file";
    $errstr  = "shutdown";
    $errno   = E_CORE_ERROR;
    $errline = 0;

    $error = error_get_last();

    if( $error !== NULL) 
        $errno   = $error["type"];
        $errfile = $error["file"];
        $errline = $error["line"];
        $errstr  = $error["message"];
    

    echo "<h1>here be dragons!</h1>";
    print_r($error);
    exit();


register_shutdown_function( "fatal_handler" );
set_error_handler('xhandler',E_ALL);

include('show_the_content');

function_that_doesnt_exist();
echo $unterminated_line_of_code
?>

【问题讨论】:

顺便说一句,Code at the moment 有一些错误... 【参考方案1】:

您无法捕获致命错误。它们是致命的,遇到它们时脚本执行会立即停止。这些错误绝不应该出现在生产站点上。

应禁止在生产环境(实时站点)上以 html 形式显示通知和警告。

这些网站通常做的是用 PHP 处理 HTTP 错误。您需要将这些错误重定向到将处理它们的 PHP 脚本。例如,在 Apache 中,您使用 ErrorDocument 指令来执行此操作。您可以将这些指令(每个 HTTP 错误代码一个)放在服务器配置中或网站文档根目录的 .htaccess 文件中。

在 PHP 脚本中,如果需要,您可以使用 $_SERVER['REDIRECT_STATUS'] 过滤不同的 HTTP 错误。当您收到带有所需 HTTP 错误的请求时,您可以随意处理它。

【讨论】:

他/她可以。 register_shutdown_function

以上是关于通过自定义错误页面处理 PHP / mysql 错误(包括致命错误)的主要内容,如果未能解决你的问题,请参考以下文章

自定义错误处理

PDO 的错误处理

yii2自定义报错页面

如何通过在 Spring MVC 中返回自定义错误页面来全局处理 404 异常?

WordPress404页面自定义

无法在 php/mysql 中上传图片