Ошибка Allowed memory size exhausted — одна из самых распространённых проблем, с которыми сталкиваются разработчики и администраторы WordPress. Она возникает, когда скрипту не хватает выделенной памяти PHP для выполнения задачи. В этой статье мы подробно разберём причины появления этой ошибки, способы её диагностики и различные методы её устранения, включая настройки конфигурации, плагины и кастомный код.
Что такое ошибка Allowed memory size exhausted и почему она возникает
Ошибка появляется, когда PHP-скрипт превышает лимит памяти, установленный в конфигурации сервера или PHP. Стандартный лимит часто составляет 64 МБ или 128 МБ, но для крупных сайтов или плагинов с тяжёлыми задачами этого может быть недостаточно.
Типичное сообщение об ошибке выглядит так:
Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 262144 bytes) in /path/to/file.php on line 123
Это означает, что скрипт пытался выделить дополнительную память сверх лимита, и процесс остановился.
Основные причины:
- Запросы к базе данных или обработка больших массивов данных.
- Неправильно работающие плагины или темы с утечками памяти.
- Скрипты, выполняющие тяжелые операции, например, генерация отчетов, импорт/экспорт.
- Недостаточный лимит памяти PHP в настройках сервера.
Как проверить текущий лимит памяти и диагностировать проблему
Первый шаг — проверить, какой лимит памяти установлен в вашем окружении. Для этого можно добавить в корень сайта простой PHP-файл с содержимым:
<?php
// wperror_get_memory_limit
function wperror_get_memory_limit() {
return ini_get('memory_limit');
}
echo 'Текущий лимит памяти PHP: ' . wperror_get_memory_limit();
?>
Откройте этот файл в браузере, и вы увидите текущий лимит.
Далее, чтобы понять, какой именно процесс или плагин вызывает превышение памяти, рекомендуется:
- Отключить все плагины и включать их по одному, проверяя ошибку.
- Переключиться на стандартную тему (например, Twenty Twenty-Three).
- Изучить логи сервера и PHP (часто они содержат подробности о причинах).
- Использовать плагины для профилирования памяти, например, Query Monitor.
Увеличение лимита памяти через wp-config.php и php.ini
Самый простой способ устранить ошибку — увеличить лимит памяти. Для этого можно изменить настройки в нескольких местах.
Изменение wp-config.php
Добавьте следующую строку в файл wp-config.php перед строкой /* That's all, stop editing! Happy publishing. */:
define('WP_MEMORY_LIMIT', '256M');
Это увеличит лимит памяти для фронтенда сайта до 256 МБ.
Изменение php.ini
Если есть доступ к серверу и файлу php.ini, найдите или добавьте строку:
memory_limit = 256M
После этого перезапустите веб-сервер (Apache, Nginx и т.д.).
Использование .htaccess
Если нет доступа к php.ini, попробуйте добавить в файл .htaccess следующую строку:
php_value memory_limit 256M
Однако этот метод работает не на всех серверах, особенно если используется PHP-FPM.
Плагины для контроля и управления памятью в WordPress
Для упрощения диагностики и управления памятью можно использовать специальные плагины:
- Query Monitor — позволяет отслеживать использование памяти, запросы к базе данных, ошибки PHP.
- WP Health — даёт информацию о состоянии сайта, включая лимиты памяти.
- Debug Bar — расширяет панель администратора информацией о производительности и памяти.
Установка и использование Query Monitor:
1. В админке WordPress перейдите в "Плагины" -> "Добавить новый".
2. В поиске введите "Query Monitor".
3. Установите и активируйте плагин.
4. В верхней панели админки появится пункт с информацией о памяти.
Этот плагин поможет выявить, какой запрос или плагин расходует слишком много памяти.
Кастомные решения для контроля использования памяти в коде
Если вы занимаетесь разработкой, полезно вставлять контроль использования памяти прямо в код, чтобы понять, где именно происходит утечка или большой расход.
Пример функции для вывода текущего использования памяти с префиксом домена:
function wperror_memory_usage() {
$mem = memory_get_usage(true);
echo 'Использование памяти: ' . round($mem / 1024 / 1024, 2) . ' МБ';
}
Вы можете вызывать wperror_memory_usage() в разных местах кода, чтобы мониторить изменения.
Ещё один пример — ограничение потребления памяти для тяжелых операций:
function wperror_process_heavy_task() {
ini_set('memory_limit', '512M');
// Код тяжелой операции
}
Это временно увеличит лимит памяти для выполнения конкретной задачи.
Оптимизация кода и базы данных как способ предотвратить ошибку
Увеличение лимита памяти — это лишь временное решение. Важно оптимизировать работу сайта, чтобы не допускать чрезмерного расхода ресурсов.
Советы по оптимизации:
- Используйте пагинацию или ленивую загрузку для вывода больших списков.
- Оптимизируйте запросы к базе данных, избегайте избыточных JOIN и SELECT.
- Проверяйте плагины на предмет утечек памяти и отключайте или заменяйте проблемные.
- Регулярно очищайте кэш и базу данных (плагин WP-Optimize поможет).
- Используйте транзиенты для кэширования дорогостоящих операций.
Пример оптимизации запроса с использованием wpdb и транзиентов
function wperror_get_cached_data() {
$cached = get_transient('wperror_expensive_query');
if (false !== $cached) {
return $cached;
}
global $wpdb;
$result = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}posts WHERE post_status = 'publish' LIMIT 100");
set_transient('wperror_expensive_query', $result, 12 * HOUR_IN_SECONDS);
return $result;
}
Такой подход уменьшит нагрузку на базу данных и снизит потребление памяти.