Кэшировать только часть страницы в PHP

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

Zend_Cache

Я бы, вероятно, использовал Zend Frameworks Zend_Cache для этого.

Вы можете просто использовать этот компонент, не используя всю инфраструктуру.

Перейдите на страницу загрузки Zend Framework и возьмите последнюю версию .

После того, как вы загрузили основные файлы, вам нужно будет включить Zend_Cache в свой проект. Документы Zend_Cache .

Вы решили, как вы хотите кэшировать свои данные? Вы используете файловую систему? Или вы memcache? Как только вы узнаете, что собираетесь использовать, вам необходимо использовать конкретный бэкэнд Zend_Cache.

Zend_Cache Backend / Zend_Cache Frontends

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

Документация по внутреннему документу: Zend_Cache Backend Документация по Frontend: Zend_Cache Frontends

Итак, вы бы сделали что-то вроде этого …

 <?php // configure caching backend strategy $backend = new Zend_Cache_Backend_Memcached( array( 'servers' => array( array( 'host' => '127.0.0.1', 'port' => '11211' ) ), 'compression' => true ) ); // configure caching frontend strategy $frontend = new Zend_Cache_Frontend_Output( array( 'caching' => true, 'cache_id_prefix' => 'myApp', 'write_control' => true, 'automatic_serialization' => true, 'ignore_user_abort' => true ) ); // build a caching object $cache = Zend_Cache::factory( $frontend, $backend ); 

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

Чтобы использовать Zend_Cache_Frontend_Output который вы хотите, это было бы просто . Вместо ядра вы будете использовать output . Параметры, которые вы передаете, идентичны. Затем для его использования вы:

Zend_Cache_Frontend_Output – Использование

 // if it is a cache miss, output buffering is triggered if (!($cache->start('mypage'))) { // output everything as usual echo 'Hello world! '; echo 'This is cached ('.time().') '; $cache->end(); // output buffering ends } echo 'This is never cached ('.time().').'; 

Полезный блог: http://perevodik.net/ru/posts/14/

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

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

В вашем собственном приложении вы можете кэшировать данные, поэтому вам не нужно (например) удалять базу данных по каждому запросу. Memcached – это популярный способ сделать это.

Вы можете использовать собственное кэширование с помощью ob_start (), ob_end_flush () и подобных функций. Соберите желаемый результат, выгрузите его в какой-либо файл или базу данных и прочитайте позже, если условия одинаковы. Обычно я строю md5 сумму состояния и восстанавливаю его позже.

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

 // if it is a cache miss, output buffering is triggered if (!($cache->start('mypage'))) { // output everything as usual echo 'Hello world! '; echo 'This is cached ('.time().') '; $cache->end(); // output buffering ends } echo 'This is never cached ('.time().').'; 

взятых из документации Zend_Cache .

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