让 PHP 错误提示在 WordPress 后台显示

核心提示:让 PHP 错误在 WordPress 后台显示为管理员警告 现在 PHP 程序语言已经被很多网页应用程序采用了,WordPress 也不例外。PHP 虽然很强大,但是同样有很多局限。其中一个最受欢迎的特点就是 PHP 的错误会直接在网页前端显示出来...

让 PHP 错误在 WordPress 后台显示为管理员警告

现在 PHP 程序语言已经被很多网页应用程序采用了,WordPress 也不例外。PHP 虽然很强大,但是同样有很多局限。其中一个最受欢迎的特点就是 PHP 的错误会直接在网页前端显示出来,这样会暴露很多敏感的服务器信息(如文件位置),如果被黑客看到,有可能利用一些漏洞进行服务器攻击破坏行为。 WordPress 3.3 开始引进的全新工具栏也提供了同样的功能,如果有 PHP 错误,会直接显示在工具栏固定的位置上。

让 PHP 错误提示在 WordPress 后台显示

显示错误的一些选项

虽然有了可以显示 PHP 错误的新工具栏,我们还需要调试主题和插件。幸运的是,我们的确有不少选择。

插件

有了新的工具栏,当然不会被所有人接受。所以就有开发者写了可以去除或者隐藏新工具栏的插件。

上面这些插件都有各自的特点。但是有一个是都有的:允许使用者禁用或者重新启用工具栏,禁用了就可以让 PHP 错误按我们想要的方式出现。

记录错误

关 于 PHP 错误的解决方法,WordPress 的核心团队的建议是开启错误记录。如果你正在学习 WordPress,应该已经知道 WP_DEBUG 是wp-config.php 控制的。因此你也可以自定义 WP_DEBUG_LOG 的恒量。下面提供一个 WordPress Codex 的例子,教你开启 debug log。

1
2
3
4
5
6
define('WP_DEBUG', true); // 这一句就是开启 Debug 功能
if (WP_DEBUG) {
  define('WP_DEBUG_LOG', true);
  define('WP_DEBUG_DISPLAY', false);
  @ini_set('display_errors',0);
}

这样做以后,PHP 错误会导出到 wp-content 文件夹下面的 debug.log 文件里。这样的记录方式也并非完美的。当你致力于开发一个商业插件或者是以一个团队的方式来工作的时候,这是记录错误的最好的解决方案。但是当你只是较小 规模的修改主题或者插件的时候,这样的记录就有点不实际了。可能你需要做的只是将所有的字母I加着重号,所有的字母T加斜线。当你做修改的时候,你不得不 打开,关掉,再打开,再关掉错误记录文件,这样不疯掉才怪....

将错误信息显示为管理员警告

本文采用的方法是把 PHP 错误输出为后台的管理员警告。这可能是目前最好的解决方案了。不需要插件,比直接的记录错误方便得多,而且不会对你的后台界面有什么视觉上的影响。

实现这个功能的代码是很简单的,而这个却没有引起 WordPress 团队的重视,这是很让让人费解的。把下面的代码放到 functions.php 的或者是功能插件里面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function admin_alert_errors($errno, $errstr, $errfile, $errline){
    $errorType = array (
         E_ERROR                            => 'ERROR',
         E_CORE_ERROR           => 'CORE ERROR',
         E_COMPILE_ERROR        => 'COMPILE ERROR',
         E_USER_ERROR           => 'USER ERROR',
         E_RECOVERABLE_ERROR  => 'RECOVERABLE ERROR',
         E_WARNING              => 'WARNING',
         E_CORE_WARNING         => 'CORE WARNING',
         E_COMPILE_WARNING      => 'COMPILE WARNING',
         E_USER_WARNING         => 'USER WARNING',
         E_NOTICE               => 'NOTICE',
         E_USER_NOTICE          => 'USER NOTICE',
         E_DEPRECATED                   => 'DEPRECATED',
         E_USER_DEPRECATED      => 'USER_DEPRECATED',
         E_PARSE                => 'PARSING ERROR'
    );
    
    if (array_key_exists($errno, $errorType)) {
        $errname = $errorType[$errno];
    } else {
        $errname = 'UNKNOWN ERROR';
    }
ob_start();?>
<div class="error">
  <p>
    <strong><?php echo $errname; ?> Error: [<?php echo $errno; ?>] </strong><?php echo $errstr; ?><strong> <?php echo $errfile; ?></strong> on line <strong><?php echo $errline; ?></strong>
  <p/>
</div>
<?php
echo ob_get_clean();
}
set_error_handler("admin_alert_errors", E_ERROR ^ E_CORE_ERROR ^ E_COMPILE_ERROR ^ E_USER_ERROR ^ E_RECOVERABLE_ERROR ^  E_WARNING ^  E_CORE_WARNING ^ E_COMPILE_WARNING ^ E_USER_WARNING ^ E_NOTICE ^  E_USER_NOTICE ^ E_DEPRECATED    ^  E_USER_DEPRECATED    ^  E_PARSE );

这样做之后,以下四个参数就放置到了 admin_alert_errors() 函数里面了。

  • $errno 这个参数是输出错误级别的,每一个错误类型都对应着一个固定的数字。$errno 只需要显示出来。
  • $errstr 这是输出错误短信参数。
  • $errfile 这是输出存在存在错误的文件位置的参数。
  • $errline 这是告诉你错误在哪一行的参数。

$errorType 数组可以给每一个错误类型下定义。

如: WARNING Error: [2] include(wuzup) [function.include]:

光是一个词语,任何话语都是可以的,

如: WARNING Wuzup G, You messed Something Up: [2] include(wuzup) [function.include]:

IF 语句是用来检查错误类型是不是和你定义的 $errorType 符合。如果不符合,错误提示的标题将会显示为 UNKNOWN ERROR

最后一部分就是输出的内容。现在,错误级别已经作为默认级别的提示加入到 WordPress 管理员警告里面了。

你将会用到 set_error_handler() 函数来启动 admin_alert_errors() 函数。后者正是用来显示错误警告的。接下来设定的参数就是 PHP 错误常量了。

如果你之前有过任何处理错误的经验,就会发现 E_STRICT 这个参数是不在里面的。这是因为有一些错误是来自于 WordPress 程序本身。我不大确定这是 WordPress 开发团队的错误还是本来就是设计成这样的。但无论怎样,都没有必要去显示这种错误。同样,用 E_ALL 代替直接列出所有错误也是不起作用的。如果你使用 E_ALL 的话,那就不能在管理员警告那里看到所有的错误提示。

注意:照本文这样做并不会影响到网页前端的错误提示。只会改变在后台的显示方式。

另:当我安装 WordPress 测试版的时候,我在 class-simplepie.php 文件里得到一个 DEPRECATED 错误。

教程就到这里了,希望本文能在那些恼人的 PHP 错误上帮到你。

原文:Display PHP Errors as WordPress Admin Alerts

在线客服