Кэширование плоских файлов с нулевым временем простоя

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

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

Мне интересно, какой лучший метод для создания этих кэшированных страниц в php был бы без риска того, что пользователи увидят наполовину написанные страницы.

ИЗМЕНИТЬ:

Вот часть моего файла .htaccess, которая определяет, следует ли загружать кешированный файл:

RewriteCond %{HTTP_COOKIE} (user)
RewriteRule (.*)? - [S=3] # Skip the below 2 lines if the above test passes
RewriteRule ^$ app/webroot/cache_static_html/cache_static_popular_results_1.php [L]
RewriteRule ^popular/page:([2-9])$ app/webroot/cache_static_html/cache_static_popular_results_$1.php [L]

person makeee    schedule 01.12.2011    source источник
comment
Можете ли вы создать плоский файл в автономном режиме, а затем разместить его одновременно с страницами с изменениями?   -  person Dustin Davis    schedule 02.12.2011


Ответы (2)


Symfony страдает от того же недуга, когда вы очищаете кеш. Чтобы обойти эту проблему, мы предварительно прогрели кеш. Рассмотрим следующее:

  • Создайте временный каталог (обязательно установите правильные разрешения): cache_temp

  • Добавьте код для распознавания триггера. Если доступен триггер, установите для каталога кеша значение cache_temp (вместо cache_current). Пример запуска через http: http://mydomain.com?prewarm=1

  • Код будет знать, что нужно генерировать все файлы кеша в cache_temp, а не в cache_current.

  • Переименуйте cache_current в cache_old.

  • Переименуйте cache_temp в cache_current.

  • Удалить cache_old

person Mike Purcell    schedule 01.12.2011
comment
Просто чтобы убедиться, что я понимаю, я бы установил триггер на 1, прежде чем начать всю операцию переименования кеша/переименования, а затем обратно на 0, чтобы я знал, что нужно загружать из каталога cache_temp во время выполнения операции? Любая идея, как я могу проверить наличие триггера в моих правилах htaccess (см. мое редактирование в основном посте для моих текущих правил htaccess)? Идея состоит в том, чтобы вообще не загружать мой фреймворк, если им нужно обслуживать кешированный файл, поэтому было бы идеально иметь возможность обрабатывать проверку какого-либо триггера (или, если файл кеша существует, метаданные файла..) в htaccess. - person makeee; 02.12.2011
comment
Триггер будет передан только для того, чтобы ваш код знал, что запрашивается предварительное прогревание, поэтому вы можете указать своей структуре генерировать все файлы кеша в каталоге cache_temp вместо каталога cache_curent. Таким образом, все файлы кеша доступны и готовы к использованию, поэтому вы не будете обслуживать частичные файлы кеша при больших нагрузках. - person Mike Purcell; 02.12.2011
comment
Не уверен насчет правил перезаписи, каждый запрос, который мы делаем, проходит через фреймворк, а затем фреймворк определяет, какие файлы кеша использовать. - person Mike Purcell; 02.12.2011
comment
Похоже, я могу использовать ваш метод, а в моем htaccess использовать RewriteCond %{TIME_SEC} ‹ 5, чтобы он загружался из временного кеша в течение 5-секундного интервала, пока задание cron регенерирует файлы кеша. - person makeee; 04.12.2011

Я бы предложил использовать решение memcache. кажется, вы могли бы довольно быстро записывать свои кеши и не использовать метод плоских файлов. Давай память!

person hookedonit    schedule 01.12.2011
comment
обязательно сгенерируйте контент перед буферизацией для пользователя и кэшируйте его. - person hookedonit; 01.12.2011
comment
Я использую APC для кэширования частей сайта для зарегистрированных пользователей, но для незарегистрированных пользователей я пропускаю загрузку всей структуры сайта (cakephp). В моем htaccess я проверяю, существует ли пользовательский файл cookie, и если это не так, он перезаписывает кешированный файл домашней страницы. - person makeee; 01.12.2011