Білий екран смерті: фатальна помилка: вичерпано розмір пам'яті X байтів


21

У мене є проблема з моєю установкою Drupal, наприклад:

  • коли я вмикаю або відключаю модулі, він перенаправляє мене на порожню сторінку,
  • коли я створюю новий тип вмісту і зберігаю його, перенаправляє мене на порожню сторінку,
  • коли я додаю новий вигляд і зберігаю його, він перенаправляє мене на порожню сторінку,
  • коли я намагаюся очистити кеш, він переспрямовує мене на порожню сторінку,
  • або в подібних випадках.

В основному всі сторінки підтвердження перенаправляють мене на білий екран. Коли я його знову оновлюю, він показує мені сторінку. Я намагався збільшити значення пам'яті PHP, але це не допомагає.

Чи є для цього інші рішення?

Помилка, яку я маю:

Фатальна помилка: Дозволений розмір пам'яті 100663296 байтів вичерпано (намагався виділити 8192 байт) на сайтах / всіх / модулях / переглядах / плагінах / views_plugin_localization_none.inc на лінії 1


2
Завжди перевіряйте журнали помилок, вони містять усю необхідну інформацію. Схоже, у вашому випадку у вас не вистачає пам'яті. Drupal 7 вимагає понад 32 Мб, що багато провайдерів хостингу встановлюють його за замовчуванням.
GoodSp33d

Відповіді:


20

Я знаю, що це може пізно, але мені це допомогло. У більшості випадків модуль викликає WSOD, я не міг просто відключити модулі, щоб перевірити, що це таке, оскільки я, можливо, втратив дані в процесі. Що я зробив, це тимчасово відредагувати цю функцію в module.incосновному includesкаталозі

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

І я додав ці 2 заяви про друк у код вище, а потім оновіть сторінку, модуль, який не дійшов до заяви «Завершити завантаження $ module», - це той, який має проблему ... в моєму випадку це було розроблено.

Знайшовши модуль, ви можете зайти в системну таблицю і шукати цей модуль, встановити його status = 0 і bootstrap = 0 або виконати запит:

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

Довідка: Налагодження білого екрана смерті Drupal (WSOD)


1
Додавання тверджень про друк до module_invoke_all дозволило мені швидко знайти модуль, який порушує право. Тоді я використовував барабан, щоб відключити його. Яка рятівниця!
Dan Meigs

Вас вітають @DanMeigs. Я використовував цей метод лише сьогодні, щоб виправити свій блог cleverlogic.net . Можливо, я мушу написати статтю з цього приводу, бо я впевнений, що читав багато хитрощів, намагаючись виправити WSOD
Джошуа Кіссон

11

Вставте цей код у свій index.phpфайл. Він покаже вам повідомлення про помилку замість порожньої сторінки. Принаймні, корінь проблеми може бути відомий. Вставте його відразу після тегу php.

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

Сподіваюся, це покаже вам дорогу !.

http://drupal.org/node/158043


1
Це не вийшло, я спробував це вчора, щоб побачити помилки, але він нічого не друкує
Jayaram

3
Ви перевірили свій журнал помилок? Якщо ви використовуєте Apache на Linux, спробуйте цю команду в терміналі: tail /var/log/apache2/error.log. Це покаже вам 10 останніх рядків цього файлу.
Чарлі Шліссер

Насправді, він почав показувати мені помилки. Помилка, яку я отримую, - це фатальна помилка: дозволений розмір пам'яті 100663296 байтів вичерпано (намагався виділити 8192 байт) у *** / сайтах / всіх / модулях / переглядах / плагінах / views_plugin_localization_none.inc на лінії 1
Джаярам

1
Якщо це додати, це index.phpпогана ідея (навіть тимчасова, оскільки більшість людей лінується видалити її згодом, якщо це працює), краще вставити її прямо у файл налаштувань.
kenorb

10

Причина порожнього білого екрана смерті - повідомлення про помилки вимкнено, щоб перевірити помилку, додайте у ваш файл settings.php наступні рядки:

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

У випадку виникнення помилки ("Дозволений розмір пам'яті в XXX байтів вичерпано"), ви можете спробувати наступні речі:

  1. Обрізайте кеш вручну і перевірте, чи він усуває проблему (ймовірно, добре зробити резервну копію вашої БД, перш ніж це зробити):

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

  2. Збільште ліміт пам’яті (як головна причина вищевказаної помилки - це пам'ять, вичерпана сервером, яка спричинила часткове завантаження модулів і що спричиняє проблему), додавши наступний рядок у файл settings.php: ini_set('memory_limit', '-1');
    Додавання ini_set('memory_limit', '-1'); перевизначає ліміт пам'яті PHP за замовчуванням.
    Якщо ви хочете обмежити пам'ять, а не замість цього, -1ви можете надати розмір пам'яті типу "256M" АБО "512M".


6

Цілком може бути, що в одного з ваших модулів не вистачає пам'яті.

Ви можете додати один рядок коду до файлу index.php, щоб Drupal запустив більше пам'яті, ніж налаштування за замовчуванням:

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

Додайте вищевказаний код у рядок після? Php у файлі /drupal/index.php. Якщо все почне працювати нормально, то можна визначити, що викликає проблему з пам'яттю (велика ймовірність, що це модуль).

Відключити модуль, а потім прокоментувати ini_set ('memory_limit', '256M'); і подивіться, чи завантажується зараз.

Не рекомендується залишати ini_set ('memory_limit', '256M'); на місці, як рішення, але воно може принаймні дозволити вам потрапити на сторінку з переліком модулів.

Вам може бути корисно зробити debug_backtrace (), щоб визначити, що використовувало пам'ять.


Це не допомогло
Джаярам

Також я бачу сторінку списку модулів, це відбувається лише тоді, коли я вмикаю / відключаю модулі, мені доведеться оновити її ще раз, щоб побачити сторінку підтвердження.
Джаярам

2
Замість того, щоб ставити дзвінки ini_set () в index.php, де вони будуть видалені під час оновлення, якщо вам доведеться їх кодувати в PHP, ви повинні помістити їх у файл settings.php, який є правильним місцем для конкретного сайту перевизначає
Альфред Армстронг

Якщо це додати, це index.phpпогана ідея (навіть тимчасова, оскільки більшість людей лінується видалити її згодом, якщо це працює), краще вставити її прямо у файл налаштувань.
kenorb

6

Помилка:

Фатальна помилка: Дозволений розмір пам'яті X байт вичерпано (намагався виділити Y байт)

Для перетворення байтів X в Мб розділіть на 1024 * 1024 або перевірте на Wolfram .

трапляється, коли PHP намагається виділити байти Y, але для байтів X встановлено жорсткі обмеження, встановлені memory_limitналаштуваннями конфігурації PHP .

Поточний ліміт можна перевірити, перейшовши до Адміністрації »Звіти» Звіт про стан »PHP (URL:) /admin/reports/status/phpабо надрукувавши ini_get('memory_limit')в PHP (зверніть увагу, що обмеження має бути різним для UI та CLI).

Щоб виправити це, вам потрібно знизити використання ресурсів, наприклад:

  • вимкнути будь-які модулі розробки, якими ви зараз не користуєтесь (рекомендується),

    Сюди входять: Devel, Devel Themer (якщо вони включені).

  • вимкнути будь-які модулі, які ви не використовуєте,

  • вимкнути певні змінні налагодження, які можуть впливати на ваші ресурси пам'яті, наприклад, кілька прикладів із drush:

    drush -y vset rules_debug 0
    drush -y vset rules_debug_log 0
  • вимкнути певні розширення PHP, наприклад XDebug,

  • увімкнути кешовані файли Redis / memcached та деякі PHP-кеші (наприклад, OPCache / XCache),
  • нарешті, якщо вище не допоможе - збільште memory_limitконфігурацію PHP .

Якщо ви вирішили збільшити ліміт пам’яті, багато людей тут радять насправді зламати ваше ядро, вставивши код PHP у ваш, index.phpщоб збільшити пам'ять PHP - ніколи цього не робіть ! Це дуже погана практика.

Замість цього відредагуйте settings.php(або settings.local.phpякщо у вас є) та вставте наступний код у кінці:

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

або кращий спосіб зробити це - відредагувати файл конфігурації PHP ( php.ini) та змінити наступний рядок:

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

Якщо ви не впевнені, де ваша php.ini, перевірте:

  • drush status командування
  • або йдучи на /admin/reports/status/php.

Для подальшого дослідження, які сторінки / компоненти використовують найбільше пам’яті, ви маєте такі можливості:

Для отримання додаткової інформації перевірте:


1
+1 - підкреслюючи, що інтерфейс php та CLI можуть відрізнятися memory_limit. У мене виникли проблеми лише з тим drush, що я помилився, /etc/php/7.0/cli/php.iniале не був /etc/php/7.0/cli/php.ini, тому drupal UI працював нормально. Спасибі!
miro marchi

1

Ви можете використовувати модуль для управління цим лімітом пам'яті. Модуль конфігуратора виконання програми PHP пропонує безліч варіантів налаштування без зміни файлу php.ini та перезапуску Apache.

Ви можете налаштувати такі параметри:

  • Обмеження завантаження файлу
  • Обмеження пам’яті
  • Максимальний ліміт часу виконання
  • Максимальна межа вхідної змінної

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.