Как увидеть сообщения об ошибках, когда я получаю белый экран смерти?


25

Как я могу увидеть сообщения об ошибках, когда сайт, на котором я работаю, получает белый экран?

Ответы:


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

17

Ресурс «Белый экран смерти» (полностью пустая страница) на drupal.org поможет вам увидеть все сообщения об ошибках, а также распространенные проблемы, которые их вызывают.

«Невидимые» ошибки

Если отчеты об ошибках отключены, вы можете получить фатальную ошибку, но ее не увидите. На производственном сайте часто отключают отчеты об ошибках. Если это так, и PHP обнаружил неисправимую ошибку, ни ошибка, ни содержимое не будут отображаться, поэтому вы получите полностью пустую страницу.

Что вы можете сделать для этого - включить отчет об ошибках PHP, чтобы он отображал сообщение на самой странице, или проверить файлы журналов (с сервера), чтобы найти ошибку. Как это сделать, объясняется ниже.

Включить отчеты об ошибках

Хотя он может быть отключен на коммерческих хостах и ​​производственных сайтах (по уважительной причине, чтобы пользователи не видели ошибок), эти ошибки являются одним из ваших лучших инструментов для устранения неполадок. Чтобы включить создание отчетов об ошибках, временно отредактируйте файл index.php (обычно расположенный в корневом каталоге) сразу после первого открывающего тега 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

1
если у вас есть много vhosts с настраиваемыми файлами журналов для каждого из них, просто используйте это: 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на, phpесли вы используете, drush rsкак указано выше.

Или установить XDebugрасширение PHP и сгенерировать файл трассировки ( xdebug.auto_trace=1).


1
Вы, сэр, спасатель жизни. Никакая чепуха меняющихся настроек php не сработала для меня, но это помогло!
Грег Сомерс

1

Если вы используете drush, вы можете увидеть сообщения об ошибках, используя команду drush-ws.


0

Я просто изменил значение переменной $ update_free_access с FALSE на TRUE и выполнил файл update.php. Это решило мою проблему.


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>';
}

Сообщение об ошибке покажет файл и строку кода, вызвавшего ошибку.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.