Drupal → Запрещаем удалять закэшированные страницы при автоматическом запуске крона

19.06.2011

В друпале есть два типа кэширования страниц:

1. страницы кэшируются на определённое время
2. страницы кэшируются до первой очистки кэша

На большинстве не очень посещаемых сайтах есть смысл использовать только второй тип кэширования (про boost пока не говорим). Т.е. анонимные посетители будут видеть всегда актуальную информацию взятую из кэша. Кэш же будет сбрасываться при первой активности авторизованного пользователя (например при создании/обновлении ноды) или при очистке.

Всё бы хорошо, но единственная неприятность, что при запуске крона вызывается та самая очистка кэша. И если крон запускается раз в день, то страницы будут храниться в кэше максимум день, что в общем то не совсем рационально.

Вот такой хитрый ход позволяет запретить удаление закэшированных страниц при автоматическом запуске крона:

/**
 * Implements of hook_cron().
 */
function mymodule_cron() {
  if (strpos(request_uri(), 'cron.php')) {
    if (!db_table_exists('cache_page_temp')) {
      $schema = drupal_get_schema('cache_page');
      db_rename_table('cache_page', 'cache_page_temp');
      db_create_table('cache_page', $schema);
    }
    drupal_register_shutdown_function('mymodule_restore_cache_page');
  }
}

/**
 * Shutdown function for cron cleanup.
 */
function mymodule_restore_cache_page() {
  db_drop_table('cache_page');
  db_rename_table('cache_page_temp', 'cache_page');
}

Плюс нужно отключить запуск крона средствами друпала (admin/config/system/cron) и возложить эту обязанность на кронтаб.

Теперь если на сайте не было никаких изменений, то страницы могут жить в кэше вечно :)

Скачать код в виде модуля.

Написанное актуально для
Drupal 7
Похожие записи

Комментарии

Гость
11.09.2011, 02:03

Очень, очень интересно...
А ссылка "2. страницы кэшируются до первой очистки кэша" веден на материал для шестого друпала, а в семерке все тоже самое ?

Гость
11.09.2011, 02:06

Я так понимаю, что использовать этот код можно при ЛЮБОМ значении настройки "Минимальное время жизни кеша". Все-равно он полностью защищает таблицу cache_page от очистки.

а в семерке все тоже самое ?

да

Я так понимаю, что использовать этот код можно при ЛЮБОМ значении настройки "Минимальное время жизни кеша"

только при значении "нет"

Гость
11.09.2011, 17:59

только при значении "нет"

а почему ? код только и делать что защищает таблицу от чистки во время работы крона, какая разница, что указано в настроке "Минимальное время жизни кеша" ?

просроченные данные удаляются из кэша не только при запуске крона. вы видимо не поняли основную суть кода. советую перечитать.

Гость
11.09.2011, 18:54

просроченные данные удаляются из кэша не только при запуске крона. вы видимо не поняли основную суть кода. советую перечитать.

да, возможно не понял.
у меня несколько вопросов, если можно? по порядку:
1. дайте пожалуйста ссылку на источник где можно почитать о кешировании в седьмом друпале. Не апишные методы, а именно алгоритм как работает кеш (на сайте drupal.org - не нашел, возможно плохо искал).
2. о других способах чистки кеша (при модификации страниц, при логине пользователя и т.п.) я знаю. И просто не понимаю почему, если установлено минимальное время жизни кеша скажем в 15 мин. (а максимальное не настроено), то пользователь запросивший страницу через 30 мин., при условии отсутствии ее изменений, должен получить ее не из кеша а новый отрендерированный вариант?
3. у вас в статье есть строчки:

Плюс нужно отключить запуск крона средствами друпала (admin/config/system/cron) и возложить эту обязанность на кронтаб.

зачем это делать? ведь ваш код - это хук на запуск в кроновской очереди, и какая разница кто инициировал выполнение кроновской задачи: встроенный крон друпала или внешний вызов от системного кронтаба ? результат то должен быть одинаков... все равно должна быть вызвана ваша ф-я mymodule_cron которая переименует защищаемую таблицу и вернет ее в обычное состояние по окончанию запроса к серверу. Кстати тут тоже вопрос, а база данных к моменту выполнения shutdown_function разве уже не закрыта, если это к примеру sqlite3?

1. http://www.lullabot.com/articles/beginners-guide-caching-data-drupal-7
2. страница будет получена из кеша, но в течении <15 минут после изменения будет выдаваться старая версия
3. я уже не помню почему сделал именно так, видимо были какие то тонкости. соединение с базой не закрывается. с sqlite не тестировал

Добавить комментарий