Jak wyświetlić komunikaty o błędach, gdy pojawia się biały ekran śmierci?

25

Jak mogę zobaczyć komunikaty o błędach, gdy witryna, nad którą pracuję, ma biały ekran?

sokratis
źródło

Odpowiedzi:

33

Umieść to na dole 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);
Mikrofon
źródło
Jest to świetne rozwiązanie dla witryn programistycznych, chociaż wolę /var/log/apache2/error.log dla witryn na żywo. Ale to działa. :)
Citricguy
17

Zasób Biały ekran śmierci (całkowicie pusta strona) na drupal.org przeprowadzi cię przez kolejne etapy, aby zobaczyć komunikat o błędzie, a także typowe problemy, które je powodują.

Błędy „niewidoczne”

Jeśli raportowanie błędów jest wyłączone, może wystąpić błąd krytyczny, ale go nie widać. W witrynie produkcyjnej często raportowanie błędów jest wyłączone. Jeśli tak jest, a PHP natrafi na niemożliwy do naprawienia błąd, nie zostanie wyświetlony ani błąd, ani treść, dlatego otrzymujesz całkowicie pustą stronę.

Możesz w tym celu włączyć raportowanie błędów PHP, aby wyświetlał komunikat na samej stronie, lub sprawdzić pliki dziennika (z serwera), aby wyszukać błąd. Jak to zrobić, wyjaśniono poniżej.

Włącz raportowanie błędów

Chociaż można go wyłączyć na komercyjnych hostach i stronach produkcyjnych (nie bez powodu, aby użytkownicy nie widzieli błędów), błędy te są jednym z najlepszych narzędzi do rozwiązywania problemów. Aby włączyć raportowanie błędów, tymczasowo edytuj plik index.php (zwykle znajdujący się w katalogu głównym) bezpośrednio po pierwszym otwierającym znaczniku PHP (nie edytuj rzeczywistych informacji o pliku!), Aby dodać:

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

Teraz będziesz mógł zobaczyć wszelkie błędy, które występują bezpośrednio na ekranie. Problemy z pamięcią mogą nadal nie być wyświetlane, ale jest to pierwszy krok w procesie eliminacji.

Jeśli korzystasz z konfiguracji obejmującej wiele witryn i chcesz, aby w jednej witrynie pojawiały się błędy, najpierw sprawdź nazwę hosta jak w:

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

Jeśli problem występuje podczas uruchamiania update.php, otwórz update.php w edytorze tekstu i odkomentuj następujący wiersz:

ini_set('display_errors', FALSE);
iStryker
źródło
10

Zajrzyj do dziennika błędów Apache, w Ubuntu, w którym się znajduje, /var/log/apache2/error.logdzięki czemu możesz:

tail -f /var/log/apache2/error.log
tostinni
źródło
2
sudo tail -f /var/log/apache2/error.log
Citricguy,
1
jeśli masz wiele vhostów z niestandardowymi plikami dziennika dla każdego z nich, po prostu użyj tego: sudo tail -f /var/log/apache2/*.log, a następnie odśwież stronę, która kończy się na wsod
izus
2

Znalazłem prosty sposób na śledzenie błędów WSOD, uruchamiając całą witrynę drush, np .:

drush rs

Po tym wejdź na stronę pod podanym nowym adresem (np. 127.0.0.1:8080), A następnie spróbuj odtworzyć problem, a zobaczysz wszystkie błędy na ekranie terminala. Nie musisz ponownie konfigurować swojego PHP, szczególnie w przypadku display_errorsawarii (np. MAMP).


Znalazłem też inny trudny sposób, używając debuggerów, np .:

  • OS X:

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

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

    Uwaga: zmień httpdna, phpjeśli używasz drush rsjak wyżej.

Lub instalując XDebugrozszerzenie PHP i wygeneruj plik śledzenia ( xdebug.auto_trace=1).

kenorb
źródło
1
Panie, ratujesz życie. Żadna ze zmieniających się ustawień php nonsens nie działała dla mnie, ale to załatwiło sprawę!
Greg Somers
1

Jeśli używasz drush, możesz zobaczyć komunikaty o błędach za pomocą komendy drush-ws.

Manikandan
źródło
0

Właśnie zmieniłem wartość zmiennej $ update_free_access z FALSE na TRUE i wykonałem plik update.php. To rozwiązało mój problem.

Saeed Afzal
źródło
0

Możesz zmodyfikować index.php i zawinąć kod za pomocą try / catch. Lubię to:

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

Komunikat o błędzie pokaże plik i wiersz kodu, który spowodował błąd.

Trincer
źródło