Ошибка Allowed memory size exhausted — одна из самых распространённых в WordPress. Она возникает, когда выделенный PHP-скрипту лимит оперативной памяти превышается, и сайт перестаёт корректно работать. В этой статье мы подробно разберём причины возникновения ошибки, методы её устранения и профилактические меры, чтобы вы могли быстро и эффективно решать эту проблему на своих сайтах.
Что такое ошибка Allowed memory size в WordPress и почему она возникает
Когда WordPress обрабатывает запрос, PHP выделяет определённое количество оперативной памяти для выполнения скриптов. Этот лимит определяется параметром memory_limit в файле конфигурации PHP. Если во время выполнения скрипта расход памяти превысит этот лимит, сервер выдаст ошибку вида:
Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)Причины могут быть разными:
- Слишком низкий лимит памяти, установленный на сервере;
- Неоптимизированные плагины или темы, которые потребляют много ресурсов;
- Большие операции с базой данных или массивами данных в коде;
- Ошибки в пользовательских скриптах, приводящие к бесконечным циклам или утечкам памяти.
Важно понимать, что просто увеличить лимит памяти — не всегда решение. Нужно выявить и устранить первопричину.
Как проверить текущий лимит памяти и использовать плагины для диагностики
Первый шаг — узнать, какой лимит памяти установлен на вашем хостинге. Для этого можно создать файл phpinfo.php с содержимым:
<?php phpinfo(); ?>После загрузки на сервер и перехода по адресу файла, в разделе memory_limit будет указан текущий лимит.
Для пользователей WordPress существуют плагины, облегчающие диагностику:
- Query Monitor — показывает использование памяти, время выполнения запросов и ошибки.
- WP Server Stats — отображает системную информацию, включая лимиты PHP.
Эти инструменты помогут понять, какие процессы потребляют память и как часто возникает ошибка.
Практические способы увеличить лимит памяти в WordPress
Если лимит действительно слишком мал и ваш сайт требует больше ресурсов, можно увеличить значение параметра memory_limit несколькими способами.
Изменение в файле wp-config.php
Добавьте в корне вашего сайта в файл wp-config.php следующую строку перед строкой /* That's all, stop editing! Happy publishing. */:
define('WPNEWS_memory_limit', 'wpnews_increase_memory_limit');
function wpnews_increase_memory_limit() {
ini_set('memory_limit', '256M');
}
wpnews_increase_memory_limit();Или более просто, без функции:
define('WP_MEMORY_LIMIT', '256M');Это увеличит лимит до 256 Мб, что достаточно для большинства сайтов.
Изменение файла php.ini
Если есть доступ к файлу php.ini на сервере, найдите строку memory_limit и измените на:
memory_limit = 256MПосле этого нужно перезапустить сервер или PHP-FPM, если используется.
Использование .htaccess (на серверах Apache)
Добавьте в файл .htaccess в корне сайта:
php_value memory_limit 256MЭтот метод работает не на всех хостингах.
Оптимизация кода и выбор плагинов для снижения потребления памяти
Увеличение лимита — временная мера. Чтобы избежать повторения ошибки, нужно оптимизировать сайт.
Аудит и отключение тяжёлых плагинов
Часто плагины, особенно те, что выполняют сложные операции или делают большое количество запросов, потребляют много памяти. Используйте Query Monitor, чтобы выявить таких «тяжеловесов».
Рассмотрите альтернативы или удалите неиспользуемые плагины.
Оптимизация пользовательских функций
Если вы пишете свой код, следите за тем, чтобы не создавались большие массивы без необходимости, избегайте рекурсий без выхода и больших циклов.
Например, если у вас есть функция, которая загружает много данных из базы, попробуйте использовать постраничную загрузку (pagination) или WP_Query с ограничениями.
Пример оптимизированного запроса WP_Query
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => get_query_var('paged') ? get_query_var('paged') : 1
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
the_title('<h2>', '</h2>');
}
}
wp_reset_postdata();Такой подход поможет не загружать сразу все записи и снизит нагрузку на память.
Создание собственного плагина для мониторинга использования памяти WordPress
Для продвинутых пользователей можно создать простой плагин, который будет логировать использование памяти в файл и помогать выявлять проблемы.
<?php
/**
* Plugin Name: WPNews Memory Logger
* Description: Логирование использования памяти для отладки
* Version: 1.0
* Author: WPNews
*/
function wpnews_log_memory_usage() {
$mem_usage = memory_get_usage(true);
$mem_peak = memory_get_peak_usage(true);
$log = date('Y-m-d H:i:s') . " - Memory usage: " . round($mem_usage / 1024 / 1024, 2) . " MB, Peak: " . round($mem_peak / 1024 / 1024, 2) . " MB\n";
error_log($log, 3, WP_CONTENT_DIR . '/memory_usage.log');
}
add_action('shutdown', 'wpnews_log_memory_usage');
?>Этот код добавляет в папку wp-content файл memory_usage.log с информацией об использовании памяти после каждого запроса. Это позволит отслеживать пиковые нагрузки и выявлять аномалии.
Заключение: комплексный подход к решению ошибки Allowed memory size
Ошибка Allowed memory size exhausted — сигнал о том, что сайт требует внимания к ресурсам. Простое увеличение лимита памяти — это быстрое, но не всегда правильное решение. Важно:
- Диагностировать, какие процессы потребляют память;
- Оптимизировать плагины и темы;
- Писать эффективный код;
- Использовать инструменты мониторинга.
Только такой подход обеспечит стабильную работу сайта и избавит вас от повторных проблем с памятью.