Назад к блогу

Ускоряем бэкенд Drupal с помощью $settings['state_cache']

2025-08-136 мин чтения

На большом сайте Gov Drupal, над которым я работаю, страницы /admin/reports/status и /admin/config работали медленно. После включения $settings['state_cache'] страницы стали загружаться намного быстрее. Редакторы сразу это заметили.

Если ваша область администрирования работает медленно, это может помочь. Drupal выполняет множество мелких чтений из State API при каждом запросе, а их кэширование сокращает обращения к базе данных. В Drupal 10.3 вы можете включить его с помощью $settings['state_cache'] = TRUE в settings.php. В Drupal 11 кэширование состояния включено по умолчанию, и настройка была удалена. Если ваш сайт хранит большое количество крупных элементов в State, сначала проверьте это, прежде чем включать его в 10.3.

Что хранит State API

Drupal хранит небольшие, специфичные для сайта значения в коллекции ключ-значение под названием state. Примеры: время последнего запуска cron, флаги обслуживания, вспомогательные переключатели, используемые ядром и модулями. Без кэширования каждое чтение может обращаться к базе данных.

Почему state_cache помогает

Экраны администрирования выполняют множество мелких проверок. Кэширование этих значений устраняет множество обращений к базе данных. Результат — более быстрые страницы и меньшая нагрузка на базу данных. Простое изменение, явная выгода.

Доступность

  • Drupal 10.3+: включите с помощью $settings['state_cache'].
  • Drupal 11+: включено по умолчанию; настройка была удалена.

Как это работает

Drupal загружает значение один раз, сохраняет его в кэше и повторно использует при последующих запросах. Когда значение изменяется, Drupal обновляет хранилище и инвалидирует запись в кэше. Чтения остаются быстрыми, а данные — корректными.

Включение в Drupal 10.3+

Добавьте это в settings.php:

$settings['state_cache'] = TRUE;

Затем очистите кэши.

Быстрая проверка перед включением

Если ваш сайт хранит слишком много или слишком большие значения в state, их кэширование может привести к излишнему потреблению памяти. Выполните этот запрос:

SELECT COUNT(*) AS num_items,
       SUM(LENGTH(value)) AS total_bytes
FROM key_value
WHERE collection = 'state';

Вы можете выполнить то же самое с помощью Drush:

drush sql:query "SELECT COUNT(*) AS num_items, SUM(LENGTH(value)) AS total_bytes FROM key_value WHERE collection = 'state';"

PostgreSQL:

drush sql:query "SELECT COUNT(*) AS num_items, SUM(OCTET_LENGTH(value)) AS total_bytes FROM key_value WHERE collection = 'state';"

Приблизительные правила:

  • num_items до примерно 100 и total_bytes около 100 КБ обычно в порядке.
  • Если вы видите большие блоки данных, переместите их в другое место (в кэш-корзину, конфигурацию или пользовательскую таблицу) перед включением.

Проблемы, которые это может облегчить

  • Медленные страницы администрирования после входа.
  • Высокая нагрузка на базу данных во время редакционной работы, пакетных операций или интенсивного использования cron.
  • Всплески задержки на общих серверах баз данных.

Если ваш бэкенд кэширования — база данных

Да, это все равно помогает. Вы будете выполнять меньше чтений из key_value. Страницы администрирования могут загружаться быстрее. Но чтения по-прежнему будут обращаться к базе данных, поэтому выгода будет меньше, чем при использовании Redis или Memcached. Это безопасно включить сейчас и планировать переход на кэш в памяти позже.

Хорошие сочетания

  • Redis или Memcached для хранения кэша, чтобы обращения к состоянию находились в памяти. Проверьте ваш бэкенд кэширования в settings.php и следите за коэффициентом попаданий.
  • Держите состояние небольшим. Используйте его для флагов и легковесных значений, а не для больших блоков данных.
  • Измеряйте до и после. Локально попробуйте Webprofiler или Devel, чтобы сравнить количество запросов. В продакшене используйте ваш APM.

Предостережения

  • Очень большие значения состояния могут раздуть кэш. Сначала исправьте данные, затем включите.
  • Очистка кэша не удаляет значения состояния; она только инвалидирует кэшированные копии.
  • В Drupal 11 настраивать нечего. Вы уже получаете выгоду.

Краткий контрольный список

  1. Выполните SQL-проверку выше.
  2. Удалите любые слишком большие значения из state.
  3. В Drupal 10.3 — 10.x добавьте $settings['state_cache'] = TRUE; и очистите кэши.
  4. Убедитесь в уменьшении количества запросов на страницах администрирования и наблюдайте за снижением нагрузки на базу данных.

Итог

Небольшое изменение. Заметное улучшение для редакторов. Включите, протестируйте и наслаждайтесь более отзывчивыми страницами администрирования.