К постам Опубликовано: 2017-01-07

Кэш в CMS Opencart

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

И так. Буду показывать на версии "2.3.0". 

Для того то бы взглянуть что нам вообще доступно заглянем в класс OpenCart/upload/system/library/cache.php
И увидим что нам доступно три метода и конструктор в который мы можем передавать адаптер ("file', 'apc', 'mem'). По умолчанию стоит запись в файлы. И время кэша, стандартное время кэша = час = 3600 сек.

class Cache {
    private $adaptor;

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

    public function __construct($adaptor, $expire = 3600) {
        $class = 'Cache\\' . $adaptor;
        if (class_exists($class)) {
            $this->adaptor = new $class($expire);
        } else {
            throw new \Exception('Error: Could not load cache adaptor ' . $adaptor . ' cache!');
        }
    }

    //Получаем содержимое кэша по ключу, который мы указали в методе "set"

    public function get($key) {
        return $this->adaptor->get($key);
    }

    //Создаем кэш. 1 аргумент = ключ/имя(должно быть уникальным), 2 аргумент = значение, данные       //которые хотим закэшировать.

    public function set($key, $value) {
        return $this->adaptor->set($key, $value);
    }

    //Удаление кэша
    public function delete($key) {
        return $this->adaptor->delete($key);
    }
}

 

Пример кэша на Opencart. Возьмем контролер главной страницы "OpenCart/upload/catalog/controller/common/home.php".
Начало класса будет там таким.
  

class ControllerCommonHome extends Controller {
    public function index() {

    if ($this->cache->get('home') == false) {
        ....тут ваш код...много обращений к базе, обработка чего-то...
    }

 

1.    Сразу после открытия метода index пишем условие на наличие кэша для данной страницы. Так как при вызове метода get кэш не будет еще сформирован(нет там странички с названием "home" ), то мы получим false, соотвественно если оно равно false то мы данные получаем, обрабатываем, вычисляем и отдаем динамически как обычно.

 if ($this->cache->get('home') == false)

 

2. Теперь посмотрм в конец метода index, он должен выглядеть как-то так. 

        $this->response->setOutput($this->load->view('common/home', $data));
    }

Тоесть просто выводит сформированные данные массива $data в шаблон. 
Наша задача написать условие, при котором данные кэшировались. В конец пишем(заменяем то что в 2 пункте, на следуещее). 

        $this->cache->set('home', $data);//Устанавливаем имя(home), и массив тот же что и на вывод
        $this->response->setOutput($this->load->view('common/home', $data));
    }//здесь другое(стандартное) условие метода.
    }//здесь закачивается условие наше IF, и начинается условие else
    else{//Если кэширование произошло, взять страницу "home" из кэша(файла), и вызвать вместо  массива 
        $this->response->setOutput($this->load->view('common/home', $this->cache->get('home')));
    }
}//конец метода
}//конец класса

 

Теперь перезагрузим страницу "home" в браузере. И пойдем посмотрим в папку кэша "OpenCart/upload/system/storage/cache".
Если там нет нашей страницы, посмотрите на права для записи этой папки,  поставьте на запись. Если все впорядке, но все равно нет странцы в кэше, то идем в логи OpenCart/upload/system/storage/logs/error.log. И смотрим в чем проблема.

 

3. При обновлении желательно обновлять информацию :D по этому сделаем малюсенький пример на базе обновления товара(который естественно выводиться на главной). Для того что бы обновить главную при обновлении товара, идем сюда OpenCart/upload/admin/controller/catalog/product.php - админ часть опенкарта, в которой находяться методы добавления, обновления, и удаления(ну и не только). 

Ищем метод edit:

    public function edit()
И сразу в нем пишем удалить кэш главной страницы.
    public function edit() {
        $this->cache->delete('home');//все что нужно нам добавить
   // тут дальше куча кода который нам не интерестен =)

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