Обработка кеширования динамических данных - PullRequest
2 голосов
/ 14 апреля 2011

Я использую что-то под названием Quickcache для PHP, которое обеспечивает полностраничное кэширование веб-страниц. Он отлично работает, но моя единственная проблема в том, что у меня динамический веб-сайт, и некоторые вещи не обновляются так, как я хочу, когда включено кэширование.

Например, если пользователь входит в систему, окно входа в систему все равно будет отображаться, даже если на сервер пользователь вошел (я могу перейти на некэшированную часть сайта, и он покажет, что пользователь вошел в систему отлично). отлично). То же самое касается изменения пользовательских настроек и т. Д.

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

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

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

Ответы [ 4 ]

6 голосов
/ 14 апреля 2011

Я не php человек, но я могу рассказать вам о кешировании.

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

  • Данные, которые не изменяются для каждого пользователя или для каждой страницы - кэшируйте в памяти приложения и захватывайте их вместо перехода в БД.
  • Данные, которые изменяются впользователь, но не на страницу - кэш в сеансе пользователя
  • Данные, которые изменяются на страницу, но не на пользователя - кэш в памяти приложения, используя имя страницы в качестве ключа
  • Данные, которые изменяются на пользователя вpage - кеширование в сеансе с именем страницы в качестве ключа
  • Данные, уникальные для каждого запроса страницы - не кешировать.

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

0 голосов
/ 22 октября 2012

Извините, что оживил старый пост, но после прочтения этого я чувствую, что вопрос ОП все еще очень актуален.

Из того, что я понял, у вас есть проблема персонализации и свежести, очень распространенная проблема при работе с динамическими сайтами.

Что вам нужно сделать, это:

A. Мониторинг использования контента для определения динамических объектов, которые постоянно восстанавливались (но не кэшировались). Обратите внимание, что выявление абсолютно (100%) неизмененных объектов поможет избежать проблем, связанных с персонализацией, поэтому вам необходимо убедиться, что вы используете перекрестную проверку, надежные методы ... (т. Е. Установите флажок Размер, вплоть до байт)

B. Как только найдется хороший «потенциальный кандидат», сделайте его Cachable, переопределив / создав новую HTTP-директиву для Caching.

C. Продолжайте отслеживать использование контента, время от времени (часто) перезагружая свежую версию и сравнивая ее с текущим кэшированным объектом, чтобы сохранить его свежим.

Это суть этого. Описание аналогичного «обучающегося» механизма кэширования можно найти здесь: Динамическое кэширование .

Внутри использовалась эвристика обучения, аналогичная динамическому контенту Cache, и 5-минутная частота обновления для свежести.

GL.

0 голосов
/ 14 апреля 2011

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

Но я бы предложил создать вашу собственную систему кэширования, используя, например, Zend_Cache lib (если вы используете эту платформу).Вы решите, что и как кэшировать, так что это, в принципе, наилучший эффект, которого вы можете достичь.

После загрузки страницы вы проверите страницу в кэше и, если она есть, используйте ее.

Это лучший способ, который я могу предложить, поскольку вы не хотите кэшировать некоторые динамические действия (маршруты).Вы можете просто исключить их из системы кэширования, которую вы создадите.Я делаю подобные вещи со сложными запросами, но вы можете кэшировать все.И сразу после изменения sth на странице вы можете обновить кеш.

0 голосов
/ 14 апреля 2011

Тебе повезло, что ты сразу получил столько трафика на свой сайт, не так ли?

Не уверен, как работает этот конкретный инструмент "Quickcache", но концептуально вам нужно иметь PHP-файл верхнего уровня с включениями для частей, которые можно кэшировать, чтобы вы загружали полустатические части из кэша. копии и документация верхнего уровня, содержащая динамический контент при каждой загрузке. Smarty позволяет вам делать это с помощью шаблонов, которые я считаю. Для простых случаев (и некоторых не так просто) я обычно пишу свой собственный код.

Затем очищайте кэш включаемых файлов только по мере необходимости, возможно, ежедневно cron или запускайте в коде административным обновлением, которое изменяет значения там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...