ZF - Как кешировать части макета - PullRequest
0 голосов
/ 16 августа 2010

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

  • Как вы кешируете страницы с динамическими данными? Например. макет содержит информацию, специфичную для пользователя.

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

  • Есть ли ZF рекомендуемый способ сделать это? Например. кэшировать только представление, а не макет или наоборот.

Cache action helper предоставляет приятный интерфейс для кеширования всех действий. Любое решение для кэширования содержимого страницы или частичных или просмотра помощников?

1 Ответ

0 голосов
/ 16 августа 2010

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

Например, одно из моих приложений предназначено для агентства недвижимости, которое работает в нескольких, но не во всех провинциях нашей страны. У нас есть db-таблица провинций, некоторые из которых включены для внешнего интерфейса, и нам нужно визуализировать их в разных местах (скажем, как опции в элементе select). Мы делаем что-то вроде этого (устаревшая кодовая база, над которой я работаю, использует объекты DAO для доступа к базе данных и Cache_Lite PEAR для кэширования, поэтому пример не является строго Zend Framework, но принцип применяется в равной степени):

/**
 * A service for fetching provinces
 */
class My_Service_Provinces
{
    protected $_daoProvinces;
    protected $_provinces = array();
    protected $_cache;


    public function __construct($daoProvinces)
    {
        $this->setDaoProvinces($daoProvinces);
    }

    public function setDaoProvinces($daoProvinces)
    {
        $this->_daoProvinces = $daoProvinces;
        return $this;
    }

    public function getDaoProvinces()
    {
        return $this->_daoProvinces;
    }

    public function setCache($cache)
    {
        $this->_cache = $cache;
        return $this;
    }

    public function getCache()
    {
        if (null == $this->_cache){
            $this->_cache = new My_Cache_Provinces();
        }
        return $this->_cache;
    }

    public function getProvinces()
    {
        if (null == $this->_provinces){
            $cache = $this->getCache();
            $data = $cache->get();
            if (!$data){
                $dao = $this->getDaoProvinces();
                $rows = $dao->frontend();
                $data = array();
                while ($row = $rows->get_row()){
                    $data[$row['provinceId']] = $row;
                }
                $cache->save(serialize($data));
            } else {
                $data = unserialize($data);
            }
            $this->_provinces = $data;
        }
        return $this->_provinces;
    }

    public function getProvince($provinceId)
    {
        $provinces = $this->getProvinces();
        return isset($provinces[$provinceId]) ? $provinces[$provinceId] : null;
    }
}

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

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

$service = My_Service_Factory::getService('provinces');
$provinces = $service->getProvinces();

Knowwhatimsayin?

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