当我收到死亡的白屏时,如何查看错误消息?


25

当我正在工作的网站出现白屏时,如何查看错误消息?

Answers:


33

将其放在settings.php的底部:

error_reporting(-1);  // Have PHP complain about absolutely everything 
$conf['error_level'] = 2;  // Show all messages on your screen, 2 = ERROR_REPORTING_DISPLAY_ALL.
ini_set('display_errors', TRUE);  // These lines just give you content on WSOD pages.
ini_set('display_startup_errors', TRUE);

这对于开发站点非常有用,尽管我更喜欢将/var/log/apache2/error.log用于实时站点。虽然可以。:)
Citricguy 2012年

17

drupal.org上的“死亡白屏”(完全空白页)资源将带您逐步执行步骤,以查看错误消息以及导致它们的常见问题。

“不可见”错误

如果错误报告功能已关闭,则可能会收到致命错误,但看不到它。在生产站点上,通常会关闭错误报告。如果真是这样,并且PHP遇到了不可恢复的错误,则不会显示错误或内容,因此您最终将获得一个完全空白的页面。

您可以执行以下操作:打开PHP错误报告,使其在页面本身上显示一条消息,或者(从服务器)检查日志文件以查找错误。下面说明了这两种方法。

启用错误报告

尽管可以在商业主机和生产站点上将其关闭(出于充分的原因,以便使用户看不到错误),但是这些错误是您进行故障排除的最佳工具之一。要启用错误报告,请在第一个打开PHP标记后立即临时编辑index.php文件(通常位于根目录中)(不要编辑实际的文件信息!)以添加以下内容:

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

现在,您将能够在屏幕上直接看到任何错误。内存问题可能仍然没有显示,但这是消除问题的第一步。

如果您使用的是多站点设置,并且只希望一个站点出现错误,请首先检查主机名,如下所示:

if ($_SERVER['HTTP_HOST']==='some.domain.name.here') {
  error_reporting(E_ALL);
  ini_set('display_errors', TRUE);
  ini_set('display_startup_errors', TRUE);
}

如果在运行update.php时出现问题,请在文本编辑器中打开update.php并取消注释以下行:

ini_set('display_errors', FALSE);

10

看一下Apache错误日志,它位于Ubuntu中,/var/log/apache2/error.log因此您可以执行以下操作:

tail -f /var/log/apache2/error.log

2
sudo tail -f /var/log/apache2/error.log
Citricguy 2012年

1
如果您有许多带有自定义日志文件的虚拟主机,请使用以下命令:sudo tail -f /var/log/apache2/*.log,然后刷新以wsod结尾的页面
izus

2

我发现可以通过运行整个站点来找到WSOD错误的简便方法drush,例如:

drush rs

之后,访问位于给定新地址(例如127.0.0.1:8080)的站点,然后尝试重现该问题,您将在终端屏幕上看到所有错误。无需重新配置PHP,尤其是在display_errors失败的情况下(例如MAMP)。


我通过使用调试器发现了其他棘手的方法,例如:

  • OS X:

    sudo dtruss -fn httpd 2>&1 | grep -i error
  • Linux:

    sudo strace -f $(pgrep -fn httpd) 2>&1 | grep -i error

    注意:如果您使用上述方法,请更改httpd为。phpdrush rs

或安装XDebugPHP扩展并生成跟踪文件(xdebug.auto_trace=1)。


1
先生,您是救生员。没有变化的PHP设置废话对我没有用,但这确实成功了!
格雷格·萨默斯

1

如果使用的是drush,则可以使用drush-ws命令查看错误消息。



0

您可以修改index.php并使用try / catch打包代码。像这样:

try {
    define('DRUPAL_ROOT', getcwd());
    require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
    menu_execute_active_handler();
} catch (Error $t) {
    error_log('Error at Line:' . $t->getLine() . ' File: ' . $t->getFile() . ' Message:' . $t->getMessage() );
    print '<div>Message: ' . $t->getMessage() . '</div>';
    print '<div>File:' . $t->getFile() . '</div>';
    print '<div>Line:' . $t->getLine() . '</div>';
}

错误消息将显示导致错误的文件和代码行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.