【问题标题】:PHP: Changing the HTML of the white page of death (WPOD)PHP:更改死亡白页 (WPOD) 的 HTML
【发布时间】:2015-09-26 00:59:16
【问题描述】:

在 PHP 中是否可以更改死亡白页 (WPOD) 的 HTML? 目标是进行此更改,以便所有未经测试(未通过 if-else 阻止)的致命错误都将显示此自定义页面。

例如,当所需的文件不存在时,运行以下命令会返回一个 WPOD:

require 'some-non-existing-file.php';

但我想返回:

<!doctype html>
<html>
<head>
  <title>500</title>
  <style>body { background-color: #000; }</style>
</head>
<body></body>
</html>

我尝试设置我的 &lt;VirtualHost&gt; 以包含和 ErrorDocument 指令:

ErrorDocument 500 /500.html

但是根据this answer的说法,Apache开始处理PHP后,就不会再触发Apache Error文档了。

【问题讨论】:

  • 使用Nginx,你可以轻松搞定。
  • 我不确定您是否可以使用自定义错误文档来处理 500 错误
  • @RamRaider 当然可以。 httpd.apache.org/docs/2.2/custom-error.html
  • 500 是由您的 PHP 文档中的语法错误之类的事情引起的。为什么您还要为它创建自定义文档而烦恼.. 只需修复错误而不是担心您的用户会做什么见。
  • @Adelphia 对于错误来自代码的简单生态系统中的应用程序,我完全同意;但是当处理更复杂的基础设施时,包括多个应用程序一起通信并通过多个代理/网络/服务器,而您无法完全控制这些基础设施,并非所有问题都可以预料。拥有一个用户友好的页面作为备份比 WPOD 更好。此外,这个问题很容易适用于其他状态代码。

标签: php apache2.4


【解决方案1】:

您可以使用error handler检查错误

function checkErrorOnPage(){
  header("Location: 500.html");
}
set_error_handler('checkErrorOnPage');


require 'some-non-existing-file.php';

【讨论】:

    【解决方案2】:

    这不会影响 WSOD,但您可以使用 PHP 代码进行一些超出 if/else 语句的错误处理。

    如果您认为有可能导致问题的代码,请将其包装在 try/catch 块中,如下所示:

    try {
        echo inverse(5) . "\n";
        echo inverse(0) . "\n";
    } catch (Exception $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";
    }
    

    然后在catch块中可以打印出代码抛出的异常。

    http://php.net/manual/en/language.exceptions.php

    【讨论】:

    • 不幸的是 PHP 喜欢错误而喜欢异常。
    • @grim 我认为 PHP 7 应该会有所改变。更新日志包括以下内容:“许多致命错误现在是异常”
    • @georaldc 等着它
    猜你喜欢
    • 2011-11-03
    • 2011-12-15
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多