Вопрос или проблема
Я уже некоторое время занимаюсь помощью на сайте третьей стороны, который регулярно достигает предела памяти. Сначала сайт функционировал только с пределом памяти в 1 ГБ. Он переехал на хостинг, который позволял только 512 МБ, и нам пришлось попытаться выяснить, что происходит.
После глубокого анализа мы выяснили, что загрузка постов в плагине CartFlows извлекает огромное количество данных из таблицы postmeta. Это было вызвано тем, что редактор Beaver Builder использует postmeta для хранения версий страниц. Удалив предыдущие версии, нам удалось хотя бы запустить сайт, хотя он все равно загружал около 150 МБ данных из postmeta. (Мы добавили мини-плагин с GitHub, предназначенный для регулярной очистки этих версий, который утверждает, что написан для «картофельных хостов с низкими лимитами», хотя я бы не стал считать 512 МБ низким лимитом)
Тем не менее, у нас теперь есть проблема с памятью в определенной части сайта, где по каким-то причинам происходит использование более 500 МБ памяти.
Я решил снова взглянуть на плагин CartFlows, чтобы посмотреть, могу ли я вручную ограничить метаданные, которые извлекаются, в попытке уменьшить размер этого запроса и, надеюсь, сократить общее использование памяти.
Оказалось, что плагин использует get_posts
и уже указывает опцию meta_query, чтобы ограничить метаданные всего одной ключом, что должно извлекать очень небольшое количество данных.
При более подробном изучении выясняется, что, несмотря на то, что плагин пытается делать правильные вещи, система get_posts
в WordPress вызывает update_postmeta_cache, который без разбора извлекает все метаданные для соответствующих постов, чтобы обновить кэш в памяти (по сути, массив) всех метаданных постов.
Есть ли что-то, что можно сделать, чтобы решить эту проблему? Возможно, Beaver Builder не должен хранить большие объемы данных в postmeta, но я, очевидно, не могу удалить его активные данные, не сломав сайт, а WordPress без разбора сбрасывает все метаданные постов в массив кэша, consuming several hundred MB of RAM даже несмотря на то, что плагины, запрашивающие посты, этого не требуют.
Я не знаю, возможно ли отключить кэширование метаданных или если вся система построена на предположении, что все метаданные обращаются через кэш. Даже попытка вручную хакнуть кэш метаданных, чтобы игнорировать записи Beaver Builder, может остановить работу редактора страницы, если он предполагает, что соответствующие метаданные можно получить через кэш.
Ответ или решение
Использование кеша метаданных в условиях ограничения памяти
Ваша проблема с использованием памяти на стороннем веб-сайте, обслуживаемом с ограничениями памяти, действительно интересна и требует глубокой проработки. Давайте разберем ее по этапам и предложим возможные решения.
1. Понимание проблемы кеширования метаданных
Вы упомянули, что плагин CartFlows использует функцию get_posts
, которая активирует update_postmeta_cache
. Эта функция загружает все метаданные, ассоциированные с постами, и помещает их в кеш – массив, используемый для ускорения последующего доступа к данным. Однако вы правы, что такие действия могут значительно увеличивать использование памяти, особенно если касается большого объема данных, как в вашем случае с плагином Beaver Builder.
2. Анализ источника нагрузки на память
Сначала важно понять, что Beaver Builder хранит множество версий постов в поле postmeta
, что приводит к утечкам памяти. Удаление лишних ревизий, как вы уже сделали, это хороший шаг, однако проблема кроется в том, что даже с обработкой метаданных, которые вы фильтруете, все равно происходит полная загрузка всех метаданных.
3. Возможные улучшения и решения
3.1 Отключение перенаправления кеша метаданных
К сожалению, в стандартном WordPress нет опции для отключения кеширования метаданных на уровне вызова функции. Это сделано для оптимизации доступа к данным и повышения производительности. Однако можно рассмотреть несколько альтернатив.
3.2 Использование кастомного запроса
Возможно, вам стоит рассмотреть возможность создания вашего собственного запроса к базе данных с помощью WP_Query
, задавая необходимые параметры для выбора только нужных вам метаданных. Это позволит избежать ненужного загрузки данных в кеш.
$args = array(
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'your_meta_key',
'value' => 'your_meta_value',
'compare' => '='
)
),
'fields' => 'ids' // Получаем только идентификаторы постов
);
$posts = get_posts($args);
3.3 Альтернативные решения
Если ваш сайт продолжает сталкиваться с проблемами, можно также рассмотреть следующие шаги:
- Оптимизация структуры данных: Проанализируйте возможные изменения в том, как Beaver Builder хранит данные, возможно, с использованием пользовательских таблиц вместо
postmeta
. - Модули для кэширования: Обратите внимание на установки плагинов для кэширования, таких как WP Super Cache или W3 Total Cache, которые могут минимизировать нагрузку на сервер.
- Аудит памяти: Проведите аудит потребления памяти для установки конкретных точек, которые требуют оптимизации.
4. Регулярное обновление и поддержка
Не забывайте о необходимости регулярного обновления всех используемых плагинов и тем. Разработчики могут предусмотреть улучшения в коде, которые помогут оптимизировать использование памяти.
Заключение
При решении проблемы памяти на сайте с высокими ограничениями важно учитывать технические аспекты работы WordPress и плагины, а также возможные меры по оптимизации. Выбор подхода к кешированию и хранению метаданных может кардинально изменить производительность вашего ресурса. Рассмотрите предложенные варианты и выберите оптимальное решение для вашего сайта.