Как ускорить магазин - кешируем прожорливые куски кода в Opencart

Очень простой метод при котором используя стандартный функционал кеширования в Opencart можно значительно увеличить скорость магазина

март 08 , 2019

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

  • Оптимизируем базу данных
  • Оптимизируем запросы
  • Оптимизируем шаблон (скрипты, стили вниз). Но надо делать в пониманием дела что бы не допустить "прыганье страницы" при загрузке
  • Оптимизируем все фото, стили, скрипты.
  • Оптимизируем .htaccess и robots.txt
  • Оптимизируем код html - новое требования согласно google page speed
  • Смотрим на динамические выгрузки товаров.
  • Конечно, для мобильных устройств свой отдельный шаблон где выводится только то что отображается.
  • И когда сайт в продакшене применяем серверное кеширование и полное кеширование страниц.

Но сегодня мы поговорим об одном изи методе который позволит не залазить в дебри оптимизации базы, запросов и т.п. а используя стандартный функционал кешировать те самые "трудные" куски кода. 

Как применить кеширование

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

Для этого надо просто добавить пару строк кода: (добавляем в примере в файл: catalog/controller/common/header.php)

if($this->cache->get('header.categories')){ //проверяем, если ли закешированные данные
    $data['categories'] = $this->cache->get('header.categories'); //забираем в массив уже готовые данные и не делаем запросов
}else{
    $data['categories'] = /*код для получения категорий*/; //получаем категории стандартным методом
    $this->cache->set('header.categories', $data['categories']); //добавляем в кеш уже сформированные данные
}

После чего при первой загрузке страницы у нас и будет идти все эти выборки для формирования дерева из 500 категорий, но при следующем заходе данные будут браться уже не с базы и с кеша. А что такое кеш - это уже сформированные данные в файле, а как известно что считать один файл на сервере (а тем более SSD) гораздо легче и быстрее чем делать 100500 запросов в базу каждый раз.

Такой микро доработкой мы экономим очень много ресурсов сервера.

Как работает система кеширования

Без кеширования что бы сформировать массив из категорий надо сделать выборку всех категорий и всех всех подкатегорий. Далее сформировать массив данных. С кешированием при запросе страницы сервер проверяет есть ли файл кеша, если есть - отдает сформированные данные и уже нет необходимости делать какие-либо запросы в базу.

Таким образом добавив пару строк кода в узкие места магазина мы можем уменьшить ответ сервера и нагрузку  в разы. Кстати при таком подходе магазин выдерживает куда больше трафика чем без кеширования.