Досадным ответом сервера на экране браузера может быть белый экран с ошибкой с 500-ым статусом. Это явно указывает на бэкенд — на проблемы на стороне сервера.
Ошибка 500 Internal Server Error
В интернете много информации по борьбе с этой ошибкой Allowed memory size of …
Вариант №1: Файл php.ini и memory_limit
Первый метод — это изменение встроенных директив файла php.ini
memory_limit — Эта директива задаёт максимальный объем памяти в байтах, который разрешается использовать скрипту. Это помогает предотвратить ситуацию, при которой плохо написанный скрипт съедает всю доступную память сервера. Для того, чтобы убрать ограничения, установите значение этой директивы в
https://www.php.net/manual/ru/ini.core.php-1
.
Вариант №2 Функция set_time_limit
Второй метод можно использовать при помощи функции set_time_limit — ограничение времени выполнения скрипта.
Задаёт время в секундах, в течение которого скрипт должен завершить работу. Если скрипт не успевает, вызывается фатальная ошибка. По умолчанию даётся 30 секунд, либо время, записанное в настройке
max_execution_time
в php.ini (если такая настройка установлена).При вызове set_time_limit() перезапускает счётчик с нуля. Другими словами, если время ожидания изначально было 30 секунд, и через 25 секунд после запуска скрипта будет вызвана функция
https://www.php.net/manual/ru/function.set-time-limit.phpset_time_limit(20)
, то скрипт будет работать максимум 45 секунд.
Вариант №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. осталось написать разработчику об этом моменте, чтобы он «пофиксил» баг 🙂