Один из моих сайтов в Drupal 7 имеет тысячи полей, несколько типов контента, более 25 просмотров и сотни (скоро будут тысячи) типов профилей. Из-за этого я использую основной патч, который лучше кэширует информацию о полях сущностей (http://drupal.org/node/1040790), и версию Views -dev, которая лучше кэширует представления при отображении (вместо одного огромного) строка кэша просмотров со всеми данными просмотров в ней).
Это помогло большинству страниц сайта загрузить 20–30 МБ ОЗУ, а не 160 МБ + (вместо того, чтобы извлекать строки таблицы cache_ * для полей и представлений размером более 10 МБ, патчи помогают значительно повысить эффективность данных cache_ *).
Однако это создает проблему, поскольку перестройка кэша занимает очень много времени . Обычно больше минуты или двух. И в течение этого времени Drupal просто не будет загружать какие-либо страницы (поскольку кэши, из которых он пытается читать, еще не созданы, другие запросы должны ждать).
Во время циклов с низким трафиком это не имеет большого значения; около сотни пользователей просто должны подождать минуту, прежде чем страница загрузится. Но во время циклов с большим трафиком сервер Apache начинает сходить с ума, с нагрузкой на процессор более 40, и память быстро заполняется, потому что все рабочие потоки ждут и максимально используют свою память, вызывая перестановку. Это своего рода смертельная спираль. Перезапуск httpd прояснит ситуацию, но потребуется 5-10 минут, чтобы все вернулось на круги своя.
Моя цель - сделать так, чтобы очистка кэша не поставила сайт на колени. Например, если я использую отдельные функции очистки кэша admin_menu (такие как «CSS и JS», затем «Меню», затем «Реестр тем» и т. Д.), Все идет гладко, пока я не нажму опцию «Страница и еще». Это происходит, когда кэш представлений сбрасывается (очень интенсивная загрузка ЦП и базы данных с количеством представлений, которые необходимо кэшировать), и когда кэш информации поля сбрасывается (что также сильно загружает ЦП и базы данных на этом сайте).
Итак ... мои вопросы / идеи:
- Используя drush и / или другие сценарии оболочки, могу ли я очистить кеши более разумным способом, чем «уничтожить все кеши одновременно и надеяться на чистое восстановление»?
- Могу ли я заблокировать http-запросы во время очистки кеша, чтобы apache не забился кучей запросов на штамповку кеша?
- Если бы я мог очистить кеш вне Drupal / обычного httpd-запроса, я мог бы предположительно установить более высокий PHP memory_limit для операции очистки кэша и отменить мой универсальный memory_limit (прямо сейчас установлен на 256 МБ, в случае, если какой-либо отдельный поток httpd должен очистить кеш ...).
По существу: есть ли какой-нибудь разумный и изящный способ очистки всех кешей с помощью Drupal, кроме простого нажатия кнопки в пользовательском интерфейсе или использования drush cc all
?
[ Править для пояснения : главная проблема, которую я имею, - это перестройка кэша , которая (а) занимает некоторое время, и (б) блокирует все остальные запросы до тех пор, пока перестройки не будут завершены. Я хотел бы найти способ сделать так, чтобы перестройки были не такими смертоносными во время большого трафика.]