В чем разница между Zend_Cache_Frontend_Capture и Zend_Cache_Frontend_Page - PullRequest
3 голосов
/ 11 февраля 2012

Может кто-нибудь объяснить разницу между этими двумя интерфейсами Zend_Cache_Frontend_Capture и Zend_Cache_Frontend_Page?

Capture используется по умолчанию для кэширования страниц ... странно то, что он делает идентификатор с помощью переменных get, но нет никаких параметров для установки make_id_with_get_variables, как в случае Страница интерфейса ....

Может кто-нибудь объяснить это?

1 Ответ

3 голосов
/ 11 февраля 2012

Вот мое усилие объяснить разницу между ними.

Для начала давайте посмотрим на Zend_Cache_Frontend_Capture . Ссылка утверждает, что этот класс предназначен для работы только с Zend_Cache_Backend_Static.

Вы бы использовали Zend_Cache_Frontend_Capture для кэширования целых страниц, которые не имеют отношения к пользователю, получающему доступ к сайту. Этот интерфейс используется, когда у вас есть статические данные (которые могут время от времени изменяться), которые не имеют отношения к текущему пользователю, то есть они одинаковы для всех пользователей (например, RSS-канал или динамически создаваемый файл JavaScript).

Глядя дальше на Zend_Cache_Backend_Static , вы увидите, что этот бэкэнд немного особенный. Для работы с кешем требуются правила в вашем файле .htaccess. После того как вы что-то кэшировали с Frontend_Capture/Backend_Static, PHP и Zend Framework НЕ используются для обслуживания кэшированных данных. Apache видит, что файл кеша существует на основе вашего .htaccess и передает содержимое напрямую пользователю, не вызывая PHP.

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

Как только я создаю кеш и сообщаю ему, что я хочу кешировать на основе куки и сессии, теперь я могу кешировать динамически генерируемую страницу, специфичную для одного пользователя. Таким образом, если человек А получает доступ к /accounts/, страница может быть кэширована для этого конкретного пользователя, содержащая список его учетных записей, которые были извлечены из базы данных. Теперь, когда человек B получает доступ к /accounts/, он не видит кэш для человека A, поэтому страница теперь кешируется для него отдельно с информацией о каждом соответствующем пользователе в их собственном кеше.

В сумме:

  • Используйте интерфейс Capture, если у вас есть данные, которые вы можете кэшировать, это то же самое для ВСЕХ пользователей. Это будет кэш с более высокой производительностью, поскольку PHP и ZF не нужны после кэширования страницы. Недостатком является добавление правил кэширования в .htaccess

  • Используйте внешний интерфейс страницы, если вы хотите кэшировать страницы с динамическим выводом, основанным не только на URI запроса, но и на файлах cookie, данных сеанса или параметрах get / post.

Надеюсь, что это ясно и поможет вам понять различия.

EDIT: Мне кажется, я вижу, в чем проблема, не уверен, классифицируется ли это как ошибка или нет.

Zend_Controller_Action_Helper_Cache::preDispatch() генерирует идентификатор кэша на основе URI запроса (который включает строку запроса). Поскольку тикер jQuery добавляет строку запроса к URL-адресу, вы кэшируете одну копию канала для каждого URI запроса. (Ищите $ reqUri в вышеупомянутом методе класса).

Я вижу несколько вариантов: 1) посмотреть, можно ли заставить тикер не добавлять строку запроса (по крайней мере для этого конкретного URL) или 2) вручную запустить кэш захвата и передать свой собственный идентификатор, вместо того, чтобы помощник кеша сгенерировал его на основе URI запроса.

...