Naše kontakty
Možno ste nainštalovali modul pre OpenCart 3 a po jeho zapnutí sa stránka, na ktorej sa modul vykresľuje, výrazne spomalila. Častou príčinou býva to, že modul pri každom načítaní znovu skladá tie isté dáta z databázy. Riešením býva doplnenie dátovej cache do system/storage/cache/.
Tento návod opisuje všeobecný a bezpečný postup pre moduly tretích strán v OpenCart 3. Je zameraný na situáciu, keď modul na frontende opakovane generuje rovnaký výstup a jeho výpočet je zbytočne náročný.
OpenCart má vstavanú triedu Cache. Ak je použitý adaptér file, dáta sa ukladajú do súborov v priečinku system/storage/cache/.
Priebeh je zvyčajne takýto:
Typicky vtedy, keď modul na frontende opakovane:
Naopak opatrnosť je potrebná pri moduloch, ktorých výstup závisí od konkrétneho zákazníka, košíka, prihlásenia, meny, aktívnej kategórie, jazyka alebo iného kontextu. V takom prípade musia byť tieto hodnoty súčasťou cache kľúča, alebo sa daná časť nesmie cachovať vôbec.
Otvorte controller modulu, najčastejšie v ceste catalog/controller/extension/module/[nazov_modulu].php.
Zvyčajne hľadáte metódu index($setting) alebo podobnú hlavnú metódu. Cieľom je obaliť cache iba tú časť, ktorá pripravuje dátové pole pre šablónu. Bežné načítanie jazyka, pripojenie JS/CSS alebo iné ľahké operácie môžu zostať mimo cache.
Kľúč musí rozlíšiť všetky stavy, v ktorých môže mať modul iný výstup. Nestačí len názov modulu. Často je potrebné zahrnúť napríklad:
Bezpečný všeobecný vzor:
$cache_key = 'module_[nazov_modulu].' . md5(json_encode(array( 'setting' => $setting, 'store_id' => (int)$this->config->get('config_store_id'), 'language_id' => (int)$this->config->get('config_language_id'), 'customer_group_id' => (int)$this->config->get('config_customer_group_id'), 'theme' => $this->config->get('theme_' . $this->config->get('config_theme') . '_directory'), 'path' => isset($this->request->get['path']) ? (string)$this->request->get['path'] : '' )));
Ak výstup od path alebo iných URL premenných nezávisí, do kľúča ich nedávajte. Zbytočne by ste si rozdelili cache do mnohých súborov.
Na začiatok náročnej časti vložte kontrolu cache. Ak dáta existujú, rovno ich použite.
$cache_data = $this->cache->get($cache_key); if ($cache_data) { return $this->load->view('extension/module/[nazov_modulu]', $cache_data); }
Tu je dôležité, že ukladáte priamo finálne dátové pole pre šablónu, typicky premennú $data. OpenCart file cache už sama rieši životnosť súboru, takže nie je potrebné do cache ukladať ďalšie pole typu expire alebo ttl.
Pôvodný náročný kód zostane prakticky bez zmeny. Len po jeho dokončení uložíte finálne dáta do cache.
// Ak cache neexistuje, prebehne pôvodná logika modulu: // - načítanie kategórií // - načítanie produktov // - skladanie stromu // - príprava poľa $data pre twig $this->cache->set($cache_key, $data); return $this->load->view('extension/module/[nazov_modulu]', $data);
Tým dosiahnete, že prvý návštevník výstup vypočíta a ďalší už dostanú hotové dáta z cache súboru.
Otvorte administrátorský controller modulu, zvyčajne admin/controller/extension/module/[nazov_modulu].php.
Po uložení nastavenia vložte zmazanie cache. Odporúčaný postup je mazať spoločný prefix, nie konkrétny hash.
$this->cache->delete('module_[nazov_modulu]');
Pri file cache v OpenCarte sa tým zmažú všetky súbory začínajúce týmto prefixom, napríklad cache.module_[nazov_modulu].abc123.... To je dôležité, pretože jednotlivé varianty modulu bývajú rozlíšené hashom podľa jazyka, obchodu, nastavenia alebo URL kontextu.
Samotné uloženie nastavenia modulu často nestačí. Ak modul zobrazuje produkty, kategórie, výrobcov, recenzie alebo iné dáta z administrácie, je vhodné mazať cache aj pri zmene týchto dát.
Príklady:
Inak sa môže stať, že modul zostane funkčný a rýchly, ale bude určitý čas zobrazovať zastarané dáta až do expirácie cache.
V štandardnom OpenCart 3 je pri file cache bežná životnosť často 3600 sekúnd, teda 1 hodina. Táto hodnota sa odovzdáva pri vytvorení inštancie cache a file adaptér ju zapisuje do názvu súboru.
Praktický dôsledok:
Pri ladení alebo testovaní môžete cache odstrániť aj ručne v priečinku system/storage/cache/.
Poznámka: v niektorých inštaláciách OpenCartu tlačidlá na vyčistenie vývojárskych cache riešia hlavne Twig, SASS alebo modification cache. Dátovú file cache modulu je istejšie mazať priamo cez $this->cache->delete(...) alebo ručne v priečinku system/storage/cache/.
public function index($setting) { $this->load->language('extension/module/[nazov_modulu]'); $cache_key = 'module_[nazov_modulu].' . md5(json_encode(array( 'setting' => $setting, 'store_id' => (int)$this->config->get('config_store_id'), 'language_id' => (int)$this->config->get('config_language_id'), 'customer_group_id' => (int)$this->config->get('config_customer_group_id') ))); $cache_data = $this->cache->get($cache_key); if ($cache_data) { return $this->load->view('extension/module/[nazov_modulu]', $cache_data); } $data = array(); /* === TU ZAČÍNA PÔVODNÁ NÁROČNÁ LOGIKA MODULU === */ /* načítanie modelov, SQL dotazy, cykly, skladanie výstupných dát */ /* === TU KONČÍ PÔVODNÁ NÁROČNÁ LOGIKA MODULU === */ $this->cache->set($cache_key, $data); return $this->load->view('extension/module/[nazov_modulu]', $data); }
Ak sa rovnaký modul používa na viacerých layoutoch alebo vo viacerých inštanciách, je veľmi dôležité, aby bol súčasťou kľúča aj obsah $setting alebo aspoň module_id. Inak si jednotlivé inštancie môžu navzájom prepisovať cache.
Po správnom doplnení file cache sa databázovo náročný výpočet vykoná len pri prvom načítaní alebo po invalidácii. Ostatní návštevníci potom dostanú rýchlo pripravené dáta zo súboru v system/storage/cache/.