Кэшировать только часть страницы в PHP - PullRequest
6 голосов
/ 31 августа 2011

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

Ответы [ 4 ]

5 голосов
/ 31 августа 2011

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

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

3 голосов
/ 31 августа 2011

Zend_Cache

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

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

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

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

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

Бэкенды Zend_Cache / Фронтенды Zend_Cache

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

Документация бэкэнда: Бэкенды Zend_Cache Документация веб-интерфейса: Фронтенды Zend_Cache

Так вы бы сделали что-то вроде этого ...

<?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, который вы хотите, это будет simple .Вместо ядра вы бы использовали 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/en/posts/14/

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

1 голос
/ 31 августа 2011

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

// 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 .

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

1 голос
/ 31 августа 2011

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

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