Плохая производительность MODX — частая проблема интернет-магазинов на этой CMS. Основная причина — классический N+1 запрос: стандартный getResources для каждого TV-параметра выполняет отдельный запрос. При каталоге из 20 товаров это 30–50 запросов к БД, TTFB 800+ мс, высокий LCP и INP. Клиенты уходят, сервер падает при 50 пользователях. Решение — pdoTools: набор сниппетов (pdoResources, pdoMenu, pdoPage), которые работают напрямую с PDO и сокращают запросы до 1–3. Внедрение pdoTools ускоряет загрузку в 5–10 раз, снижает нагрузку на MySQL и затраты на хостинг до 30%. Наш опыт: 5 лет работы с MODX, 30+ успешных проектов. Обеспечиваем стабильность и улучшение Core Web Vitals.
Как pdoResources решает проблему N+1 запроса?
Стандартный getResources для выборки 20 ресурсов делает отдельные запросы на каждый TV-параметр — это классический N+1. pdoResources использует единый JOIN-запрос благодаря параметру &prepareTVs=1. Пример вызова:
[[pdoResources? &parents=`5` &resources=`-10` &showHidden=`0` &sortby=`menuindex` &sortdir=`ASC` &limit=`10` &includeTVs=`product_price,product_image` &prepareTVs=`1` &processTVs=`1` &tpl=`productCard` &tvPrefix=`` ]] Ключевой параметр — &prepareTVs=1, который загружает все TV одним запросом. Без него каждое TV тянет отдельный запрос, сводя преимущество на нет.
Когда pdoResources не даёт прироста?
Если на странице всего один-два ресурса без TV, разница между getResources и pdoResources минимальна. pdoResources оправдан на каталогах с десятками записей и множеством TV. Для простых меню или списков новостей с одним изображением можно оставить getResources — pdoResources не даст прироста, но и не навредит.
Настройка кэширования и парсера для максимальной производительности
Почему стоит заменить парсер на pdoParser?
Стандартный парсер MODX обрабатывает каждый тег последовательно, что создаёт задержки при большом количестве тегов на странице. pdoParser использует регулярные выражения и работает на 20–40% быстрее. Включить его можно в системных настройках:
// Система → Настройки → pdotools_parser_enable = 1 «заменяет стандартный парсер и ускоряет обработку тегов на 20–40%» (pdoTools).
Кэш pdoTools: настройка
[[pdoResources? ... &cache=`1` &cacheTime=`1800` &cacheKey=`catalog_[[+GET.page:default=1]]_[[+GET.sort:default=price]]` ]] Уникальный ключ кэша включает GET-параметры — разные фильтры используют разные кэши, исключая конфликты. Время жизни кэша подбирается под частоту обновления данных: для каталога с редкими изменениями — 1 час, для новостей — 10 минут.
Как мы настраиваем pdoTools: пошаговый план
- Аудит текущего состояния: анализируем используемые сниппеты, количество запросов, время генерации страницы.
- Замена стандартных сниппетов: устанавливаем pdoTools, заменяем getResources на pdoResources с параметром &prepareTVs=1, Wayfinder на pdoMenu, Breadcrumbs на pdoBreadcrumbs.
- Настройка кэширования: для каждого сниппета включаем кэш с уникальным ключом, учитывающим GET-параметры.
- Включение pdoParser: активируем в системных настройках, проверяем совместимость с установленными компонентами.
- Тестирование производительности: замеряем TTFB, LCP, INP, количество запросов до и после.
Пример реального кейса: интернет-магазин мебели
Для клиента с каталогом из 300 товаров, где каждый товар имел 15 TV (цена, изображения, характеристики), стандартная страница списка товаров грузилась 6 секунд. После замены getResources на pdoResources с &prepareTVs=1 и включением pdoParser время загрузки упало до 0.8 секунды. Нагрузка на MySQL снизилась с 2000 запросов в минуту до 120. Дополнительно настроили кэширование с ключами по фильтрам и страницам — пагинация стала мгновенной.
Сравнение производительности getResources и pdoResources
| Параметр | getResources | pdoResources |
|---|---|---|
| Количество запросов к БД | 30–50 | 1–3 |
| Время выполнения (20 ресурсов) | ~500 мс | ~50 мс |
| Поддержка кэширования | Ограниченная | Полная (гибкие ключи) |
| Работа с TV | N+1 запрос | Один JOIN |
Типичные ошибки при настройке pdoTools
| Ошибка | Причина | Решение |
|---|---|---|
| Медленная загрузка страницы | Забыли &prepareTVs=1 |
Добавить параметр в вызов |
| Некэшируемые меню | Не включён кэш для pdoMenu | Установить &cache=1 |
| Пагинация не работает с кэшем | Не настроен &cacheKey для pdoPage |
Указать уникальный ключ с GET-параметрами |
Что входит в настройку pdoTools?
При заказе услуги вы получаете:
- полную замену стандартных сниппетов (getResources, Wayfinder, Breadcrumbs) на pdoResources, pdoMenu, pdoPage;
- настройку кэширования каждого сниппета с учётом фильтров и пагинации;
- активацию pdoParser и проверку его совместимости с текущими компонентами;
- исправление типовых ошибок: неправильный
&prepareTVs, отсутствие кэш-ключей; - краткую документацию по использованным параметрам и рекомендации по дальнейшей оптимизации (например, переход на headless или внедрение Edge Functions).
Мы поможем избавиться от тормозов на сайте — получите консультацию по оптимизации MODX. Наши инженеры проанализируют текущее состояние и предложат план действий.
Сроки и ожидаемые результаты
Замена стандартных сниппетов на pdoTools с настройкой кэширования — от 3 до 5 часов для среднего сайта. Для крупных проектов с кастомными шаблонами — до 2 дней.
После настройки pdoTools количество запросов к БД сокращается в 10–20 раз, TTFB снижается до 100–200 мс, LCP и INP приходят в норму. Это напрямую влияет на позиции в поиске и доход от продаж. Закажите настройку pdoTools сегодня и обеспечьте стабильную работу вашего магазина.







