Ошибка PHP Fatal error: Allowed memory size of … bytes exhausted (tried to allocate … bytes) in /var/…

Досадным ответом сервера на экране браузера может быть белый экран с ошибкой с 500-ым статусом. Это явно указывает на бэкенд — на проблемы на стороне сервера.

Ошибка 500 Internal Server Error

В интернете много информации по борьбе с этой ошибкой Allowed memory size of …

Вариант №1: Файл php.ini и memory_limit

Первый метод — это изменение встроенных директив файла php.ini

memory_limit — Эта директива задаёт максимальный объем памяти в байтах, который разрешается использовать скрипту. Это помогает предотвратить ситуацию, при которой плохо написанный скрипт съедает всю доступную память сервера. Для того, чтобы убрать ограничения, установите значение этой директивы в -1.

https://www.php.net/manual/ru/ini.core.php

Вариант №2 Функция set_time_limit 

Второй метод можно использовать при помощи функции set_time_limit — ограничение времени выполнения скрипта.

Задаёт время в секундах, в течение которого скрипт должен завершить работу. Если скрипт не успевает, вызывается фатальная ошибка. По умолчанию даётся 30 секунд, либо время, записанное в настройке max_execution_time в php.ini (если такая настройка установлена).

При вызове set_time_limit() перезапускает счётчик с нуля. Другими словами, если время ожидания изначально было 30 секунд, и через 25 секунд после запуска скрипта будет вызвана функция set_time_limit(20), то скрипт будет работать максимум 45 секунд.

https://www.php.net/manual/ru/function.set-time-limit.php

Вариант №3 Функция ini_set

ini_set — Устанавливает значение настройки конфигурации.

Настройка будет хранить установленное значение пока выполняется скрипт. После завершения работы скрипта значение настройки вернётся к исходному. Нас интересует настройка:

memory_limit	"128M"	PHP_INI_ALL

Вам лишь останется установить в вашем скрипте нужное значение:

<?php
ini_set('memory_limit', '256');
?>

Список доступных настроек

WordPress

Ну а теперь поговорим, о специальных методах, которые доступны в CMS WordPress: в нем существует две константы (WP_MEMORY_LIMIT и WP_MAX_MEMORY_LIMIT), значение которых мы можем изменить путем добавления их в конфигурационный файл (wp-config.php)

define( 'WP_MEMORY_LIMIT', '128M' );
define( 'WP_MAX_MEMORY_LIMIT', '256M' );

Если проблема не ушла, разобраться поможет просмотр логов (журнала фиксации ошибок).

В CMS WordPress он может быть по умолчанию выключен. Поэтому откройте конфигурационный файл wp-config.php, который находится в корне сайта и убедитесь что значение константы находится в TRUE:

define( 'WP_DEBUG', true );

Изящно и профессионально будет дополнить эту строку определенным кодом, в котором будут задействованы еще пару полезных констант: WP_DEBUG_DISPLAY и WP_DEBUG_LOG

Можно по разному задействовать эти константы, но наиболее изящным мне показался вариант предложенный Майком из Manchester WordPress User Group:

/**
 * This will log all errors notices and warnings to a file called debug.log in
 * wp-content only when WP_DEBUG is true. if Apache does not have write permission,
 * you may need to create the file first and set the appropriate permissions (i.e. use 666).
 */
define( 'WP_DEBUG', true ); // Or false
if ( WP_DEBUG ) {
    define( 'WP_DEBUG_LOG', true );
    define( 'WP_DEBUG_DISPLAY', false );
    @ini_set( 'display_errors', 0 );
}

Как мы видим действие констант и директивы display_errors справедливы лишь в том случае, если WP_DEBUG у нас имеет значение TRUE (1).

Самое интересное, что процесс выполнения скрипта может обрываться за счет, например, фатальной ошибки другого скрипта, как в моем случаем совершенно другого плагина. Поэтому внимательно изучите файл debug.log который появится после включения кода выше, в папке /wp-content/

В моем случае, после изучения журнала ошибок я обнаружил следующее:

[18-Jan-2022 09:58:34 UTC] PHP Fatal error:  Uncaught TypeError: round(): Argument #1 ($num) must be of type int|float, string given in /var/.../wp-content/plugins/yml-for-yandex-market/models/adv.php:1062
Stack trace:
...
  thrown in /var/.../wp-content/plugins/yml-for-yandex-market/models/adv.php on line 1062
[18-Jan-2022 09:58:41 UTC] PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 20480 bytes) in /var/.../wp-includes/class-wp-hook.php on line 296
[18-Jan-2022 09:58:41 UTC] PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 20480 bytes) in /var/.../wp-includes/class-wp-fatal-error-handler.php on line 72
[18-Jan-2022 09:58:41 UTC] PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 1806336 bytes) in Unknown on line 0

Отключение данного плагина решило проблему выполнения скрипта. P.S. осталось написать разработчику об этом моменте, чтобы он «пофиксил» баг 🙂

Эта запись была размещена в WordPress с меткой .