Як бачити повідомлення про помилки, коли я отримую білий екран смерті?


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).


Інший хитрий спосіб я знайшов, використовуючи налагоджувачі, наприклад:

  • ОС 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.