Biały ekran śmierci: Błąd krytyczny: wyczerpany dozwolony rozmiar pamięci X bajtów

21

Mam problem z instalacją Drupala, na przykład:

  • kiedy włączam lub wyłączam moduły, przekierowuje mnie do pustej strony,
  • kiedy tworzę nowy typ zawartości i zapisuję go, przekierowuje mnie na pustą stronę,
  • po dodaniu nowego widoku i zapisaniu go przekierowuje mnie do pustej strony,
  • gdy próbuję wyczyścić pamięć podręczną, przekierowuje mnie z powrotem do pustej strony,
  • lub w podobnych przypadkach.

Zasadniczo wszystkie strony z potwierdzeniami przekierowują mnie na biały ekran. Kiedy go odświeżę, pokaże mi się strona. Próbowałem zwiększyć wartość pamięci PHP, ale to nie pomaga.

Czy są na to jakieś inne rozwiązania?

Błąd, który mam:

Błąd krytyczny: wyczerpany dozwolony rozmiar pamięci 100663296 bajtów (próba przydzielenia 8192 bajtów) w witrynach / wszystkich / modułach / widokach / wtyczkach / views_plugin_localization_none.inc w linii 1

Jayaram
źródło
2
Zawsze sprawdzaj dzienniki błędów, będą miały wszystkie potrzebne informacje. Wygląda na to, że w twoim przypadku kończy Ci się pamięć. Drupal 7 wymaga ponad 32 MB, co wielu dostawców hostów ustawia jako domyślną.
GoodSp33d

Odpowiedzi:

20

Wiem, że może być późno, ale pomogło mi to. Najczęściej moduł powoduje WSOD, nie mogłem po prostu wyłączyć modułów, aby sprawdzić, który to był, ponieważ mogłem stracić dane w tym procesie. Tym, co zrobiłem, było tymczasowe edytowanie tej funkcji w katalogu module.incgłównymincludes

function module_invoke_all($hook) {
  $args = func_get_args();
  // Remove $hook from the arguments.
  unset($args[0]);
  $return = array();
  foreach (module_implements($hook) as $module) {

        print "Starting loading $module <br />";

        $function = $module . '_' . $hook;
        if (function_exists($function)) {
          $result = call_user_func_array($function, $args);
          if (isset($result) && is_array($result)) {
            $return = array_merge_recursive($return, $result);
          }
          elseif (isset($result)) {
            $return[] = $result;
          }
        }

        print "Finished loading $module <br />";

  }

  return $return;
}

Dodałem te 2 instrukcje drukowania do powyższego kodu, a następnie odśwież stronę, moduł, który nie osiągnął instrukcji „Zakończ ładowanie $ moduł”, jest tym, który ma problem ... został opracowany w moim przypadku.

Po znalezieniu modułu możesz przejść do tabeli systemowej i poszukać tego modułu, ustawić jego status = 0 i bootstrap = 0 lub uruchomić zapytanie:

UPDATE system SET status = 0, bootstrap = 0 WHERE name = 'module_name' LIMIT 1

Odniesienie: Debugowanie Drupal White Screen of Death (WSOD)

Joshua Kissoon
źródło
1
Dodanie instrukcji print do module_invoke_all pozwoliło mi szybko znaleźć moduł obrażający. Następnie użyłem drush, aby go wyłączyć. Co za ratownik!
Dan Meigs
Nie ma za co @DanMeigs. Użyłem tej metody tylko dzisiaj, aby naprawić mój blog cleverlogic.net . Może powinienem napisać artykuł na ten temat, bo na pewno wiele czytałem, próbując naprawić WSOD
Joshua Kissoon
11

Wklej ten kod do swojego index.phppliku. Zamiast pustej strony wyświetli się komunikat o błędzie. Przynajmniej można poznać przyczynę problemu. Wklej go zaraz po tagu php.

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

Mam nadzieję, że pokaże ci drogę!

http://drupal.org/node/158043

Sandesh Yadav
źródło
1
To nie zadziałało, próbowałem wczoraj, aby zobaczyć błędy, ale nic nie drukuje
Jayaram
3
Czy sprawdziłeś dziennik błędów? Jeśli używasz Apache na Linux, spróbuj tego polecenia w terminalu: tail /var/log/apache2/error.log. Spowoduje to wyświetlenie 10 najnowszych wierszy tego pliku.
Charlie Schliesser
Właściwie to zaczęło pokazywać mi błędy. Błąd, który otrzymuję, to błąd krytyczny: wyczerpany dozwolony rozmiar pamięci 100663296 bajtów (próba alokacji 8192 bajtów) w *** / sites / all / modules / views / plugins / views_plugin_localization_none.inc na linii 1
Jayaram,
1
Dodanie tego do index.phpjest złym pomysłem (nawet tymczasowym, ponieważ większość ludzi jest leniwa, aby go później usunąć, jeśli to działa), lepiej wkleić go bezpośrednio do pliku ustawień.
kenorb
10

Przyczyną pustego białego ekranu śmierci jest wyłączenie raportowania błędów, aby sprawdzić błąd, dodaj następujące wiersze w pliku setting.php:

error_reporting(E_ALL);
$conf['error_level'] = 2;
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

W przypadku napotkanego błędu („Wyczerpany dozwolony rozmiar pamięci XXX bajtów”) możesz wypróbować następujące rzeczy:

  1. Ręcznie obetnij pamięć podręczną i sprawdź, czy to rozwiązuje problem (prawdopodobnie dobrze jest wykonać kopię zapasową bazy danych przed wykonaniem tego):

    Access phpMyAdmin and truncate all tables starting by cache_ from the database.

  2. Zwiększ limit pamięci (ponieważ główną przyczyną powyższego błędu jest pamięć wyczerpana przez serwer, która spowodowała częściowe załadowanie modułów i powoduje problem), dodając następujący wiersz w pliku settings.php: ini_set('memory_limit', '-1');
    Dodanie ini_set('memory_limit', '-1'); zastępuje domyślny limit pamięci PHP.
    Jeśli chcesz ograniczyć pamięć, zamiast tego -1możesz podać rozmiar pamięci, np. „256M” LUB „512M”.

Ankit Agrawal
źródło
6

Może się zdarzyć, że w jednym z modułów zabraknie pamięci.

Możesz dodać jeden wiersz kodu do pliku index.php, aby umożliwić Drupalowi działanie z większą ilością pamięci niż ustawienie domyślne:

ini_set('memory_limit','256M');

Dodaj powyższy kod w wierszu po? Php w pliku /drupal/index.php. Jeśli wszystko zacznie działać poprawnie, możesz zidentyfikować przyczynę problemu z pamięcią (najprawdopodobniej jest to moduł).

Wyłącz moduł, a następnie skomentuj ini_set ('memory_limit', '256M'); i sprawdź, czy się teraz ładuje.

Nie zaleca się pozostawiania ini_set ('memory_limit', '256M'); jako rozwiązanie, ale może przynajmniej pozwolić ci przejść do strony z listą modułów.

Pomocne może być wykonanie debug_backtrace () w celu ustalenia, co korzysta z pamięci.

Johnathan Elmore
źródło
To nie pomogło
Jayaram,
Widzę też stronę z listą modułów, dzieje się to tylko wtedy, gdy włączam / wyłączam moduły, musiałbym ją odświeżyć, aby zobaczyć stronę z potwierdzeniem.
Jayaram,
2
Zamiast umieszczać wywołania ini_set () w index.php, gdzie zostaną usunięte z aktualizacji, jeśli musisz je kodować w PHP, powinieneś umieścić je w pliku settings.php, który jest właściwym miejscem dla strony zastępuje.
Alfred Armstrong,
Dodanie tego do index.phpjest złym pomysłem (nawet tymczasowym, ponieważ większość ludzi jest leniwa, aby go później usunąć, jeśli to działa), lepiej wkleić go bezpośrednio do pliku ustawień.
kenorb
6

Błąd:

Błąd krytyczny: wyczerpany dozwolony rozmiar pamięci X bajtów (próbował przydzielić Y bajtów)

Aby przekonwertować bajty X na MB, podziel przez 1024 * 1024 lub sprawdź w Wolfram .

zdarza się, gdy PHP próbuje przydzielić bajty Y, ale istnieje sztywny limit X bajtów ustawionych w memory_limitustawieniach konfiguracji PHP .

Aktualny limit można sprawdzić, przechodząc do Administracja »Raporty» Raport o stanie »PHP (URL:) /admin/reports/status/phplub drukując ini_get('memory_limit')w PHP (zwróć uwagę, że limit może być inny dla interfejsu użytkownika i CLI).

Aby to naprawić, musisz zmniejszyć zużycie zasobów, na przykład:

  • wyłącz wszystkie moduły programistyczne, których obecnie nie używasz (zalecane),

    Obejmuje to: Devel, Devel Themer (jeśli włączony).

  • wyłącz wszystkie moduły, których nie używasz,

  • wyłącz niektóre zmienne debugowania, które mogą mieć wpływ na zasoby pamięci, np. kilka przykładów z drush:

    drush -y vset rules_debug 0
    drush -y vset rules_debug_log 0
  • wyłącz niektóre rozszerzenia PHP, takie jak XDebug,

  • włącz pamięć podręczną redis / memcached i niektóre pamięci podręczne PHP (np. OPCache / XCache),
  • w końcu jeśli powyższe nie pomoże - wzrost memory_limitkonfiguracji PHP .

Jeśli zdecydujesz się na zwiększenie limitu pamięci, wiele osób doradza ci włamanie się do twojego rdzenia poprzez wklejenie kodu PHP w index.phpcelu zwiększenia pamięci PHP - nigdy tego nie rób ! To bardzo zła praktyka.

Zamiast tego edytuj swój settings.php(lub settings.local.phpjeśli go masz) i wklej następujący kod na końcu:

ini_set('memory_limit', '512M');

lub lepszym sposobem na to jest edycja pliku konfiguracyjnego PHP ( php.ini) i zmiana następującego wiersza:

memory_limit = 512M  ; Maximum amount of memory a script may consume

Jeśli nie masz pewności, gdzie jest twój php.ini, sprawdź:

  • drush status dowództwo
  • lub przechodząc do /admin/reports/status/php.

Aby dalej zbadać, które strony / komponenty zużywają najwięcej pamięci, masz następujące możliwości:

Aby uzyskać więcej informacji, sprawdź:

kenorb
źródło
1
+1 za podkreślenie, że interfejs PHP i CLI mogą mieć różne memory_limit. Miałem zgłoszony problem tylko z drushdokładnie dlatego, że miałem błąd w, /etc/php/7.0/cli/php.iniale nie w /etc/php/7.0/cli/php.ini, więc interfejs użytkownika drupal działał dobrze. Dzięki!
miro marchi
1

Za pomocą modułu można kontrolować ten limit pamięci. Moduł PHP Runtime Configurator zapewnia wiele opcji konfiguracji bez zmiany pliku php.ini i restartowania Apache.

Możesz skonfigurować następujące parametry:

  • Limit przesyłania plików
  • Limit pamięci
  • Maksymalny czas realizacji
  • Maksymalny limit zmiennej wejściowej

Sahil Gupta
źródło