Белый экран смерти: фатальная ошибка: допустимый объем памяти X байтов исчерпан

21

У меня проблема с моей установкой Drupal, например:

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

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

Есть ли другие решения для этого?

Ошибка, которую я имею:

Неустранимая ошибка: допустимый объем памяти в 100663296 байт исчерпан (попытался выделить 8192 байт) в сайтах / all / modules / views / plugins / views_plugin_localization_none.inc в строке 1

Jayaram
источник
2
Всегда проверяйте журналы ошибок, в них будет вся необходимая информация. Похоже, в вашем случае у вас заканчивается память. Drupal 7 требует более 32 МБ, что многие хост-провайдеры устанавливают по умолчанию.
GoodSp33d

Ответы:

20

Я знаю, что может быть поздно, но это помогло мне. В большинстве случаев модуль вызывает WSOD, я не мог просто отключить модули для проверки того, что это было, так как я мог потерять данные в процессе. Я временно отредактировал эту функцию в директории module.inccore.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», - тот, с которым возникла проблема ... он был разработан в моем случае.

Найдя модуль, вы можете зайти в системную таблицу и найти этот модуль, установить его статус = 0 и bootstrap = 0 или выполнить запрос:

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

Ссылка: Отладка Drupal White Screen of Death (WSOD)

Джошуа Киссун
источник
1
Добавление операторов печати к module_invoke_all позволило мне быстро найти модуль, нарушающий работу. Затем я использовал drush, чтобы отключить его. Какой спасатель жизни!
Дэн Мейгс
Всегда пожалуйста @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
Это не сработало, я пробовал вчера, чтобы увидеть ошибки, но ничего не печатается
Джаярам
3
Вы проверили свой журнал ошибок? Если вы используете Apache на Linux, попробуйте эту команду в терминале: tail /var/log/apache2/error.log. Это покажет вам 10 самых последних строк этого файла.
Чарли Шлиссер
На самом деле, он начал показывать мне ошибки .. Ошибка, которую я получаю: Неустранимая ошибка: допустимый объем памяти 100663296 байт исчерпан (попытка выделить 8192 байта) в файле *** / sites / all / modules / views / plugins / views_plugin_localization_none.inc на линии 1
Джаярам
1
Добавлять это index.php- плохая идея (даже временная, поскольку большинству людей лень удалять ее позже, если это работает), лучше вставить ее прямо в файл настроек.
Кенорб
10

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

Ошибка:

Неустранимая ошибка: допустимый объем памяти X байтов исчерпан (попытался выделить Y байтов)

Чтобы преобразовать байты X в МБ, разделите на 1024 * 1024 или проверьте на Wolfram .

происходит, когда PHP пытается выделить Y байтов, но существует жесткое ограничение на X байтов, установленное memory_limitнастройками конфигурации PHP .

Текущий лимит можно проверить, перейдя в Администрирование »Отчеты» Отчет о состоянии »PHP (URL:) /admin/reports/status/phpили напечатав ini_get('memory_limit')в PHP (обратите внимание, что лимит будет различным для пользовательского интерфейса и 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.

Чтобы узнать, какие страницы / компоненты используют больше всего памяти, у вас есть следующие возможности:

Для получения дополнительной информации, проверьте:

kenorb
источник
1
+1 за подчеркивание того, что php UI и CLI могут иметь разные значения memory_limit. У меня была проблема только с тем drush, что у меня была ошибка, /etc/php/7.0/cli/php.iniно не в ней /etc/php/7.0/cli/php.ini, поэтому друпал UI работал нормально. Благодарность!
Miro Marchi
1

Вы можете использовать модуль для контроля этого предела памяти. Модуль PHP Runtime Configurator предоставляет множество опций для настройки без изменения файла php.ini и перезапуска Apache.

Вы можете настроить следующие параметры:

  • Предел загрузки файлов
  • Предел памяти
  • Максимальный срок исполнения
  • Максимальный предел входной переменной

Сахил Гупта
источник