Szybkość i pamięć podręczna (cache) w sklepie
Moduł 6: Zarządzanie i bezpieczeństwo · Czas czytania: 10 min
Cel lekcji: Po tej lekcji będą Państwo potrafili skonfigurować pamięć podręczną (cache) sklepu WooCommerce tak, aby sklep działał szybko, a strony osobiste nigdy nie trafiały do cache, oraz sprawdzić to w nagłówkach HTTP.
Kluczowe pojęcia: pamięć podręczna strony, wykluczenia (koszyk, zamówienie, Moje konto), pliki cookie omijające cache, nagłówki no-cache, DONOTCACHEPAGE, pamięć podręczna obiektów, Redis, fragmenty koszyka, lokalizacja geograficzna przy pamięci podręcznej strony, porządkowanie zaplanowanych działań
Dwa rodzaje stron
Podstawy pamięci podręcznej (pamięć podręczna strony, pamięć podręczna przeglądarki, pamięć podręczna obiektów, OPcache, CDN) są opisane w kursie WordPress, w lekcji 6.2. Tam znajduje się też najważniejsza zasada dla sklepów: strony osobiste nie mogą trafiać do pamięci podręcznej strony. Ta lekcja rozwija ten temat.
Sklep ma dwa rodzaje stron:
| Rodzaj | Przykłady | Cache |
|---|---|---|
| Takie same dla wszystkich | strona główna, strona sklepu, kategorie, strony produktów, strony informacyjne | Pamięć podręczna strony: tak, tu jest największy zysk |
| Inne dla każdego odwiedzającego | koszyk, zamówienie, Moje konto, strona odstąpienia od umowy z zalogowanym klientem | Pamięć podręczna strony: nigdy |
Jeśli coś pójdzie źle, od razu to widać: klient widzi koszyk innej osoby albo, co gorsza, czyjś adres na stronie zamówienia. To jest również naruszenie ochrony danych w rozumieniu RODO (GDPR) (KB 6749).
Co WooCommerce robi samo
WooCommerce wspiera pamięć podręczną na trzy sposoby. Warto je znać, aby zauważyć, kiedy coś je usuwa:
- Stałe. Na stronach koszyka, zamówienia i Moje konto WooCommerce ustawia
DONOTCACHEPAGE(a także odpowiednie stałe dla pamięci podręcznej obiektów i bazy danych). Wiele wtyczek cache odczytuje tę stałą i pomija taką stronę. - Nagłówki. Na tych samych stronach WooCommerce wysyła nagłówki no-cache WordPressa:
Cache-Control: no-cache, must-revalidate, max-age=0, privateorazExpiresz datą w przeszłości. Serwer proxy lub CDN, który przestrzega reguł, nie zapisuje wtedy strony. Dla zalogowanych użytkowników dochodzi jeszczeno-store. - Pliki cookie. Gdy tylko ktoś doda coś do koszyka, WooCommerce ustawia pliki cookie, takie jak
woocommerce_items_in_cart,woocommerce_cart_hashiwp_woocommerce_session_.... Dobre mechanizmy cache nie podają odwiedzającym z takim plikiem cookie zapisanej strony, również stron produktów, ponieważ na przykład koszyk w nagłówku strony jest wtedy inny dla każdego odwiedzającego.
Dokumentacja WooCommerce zaleca dla wtyczek cache: wykluczyć strony Koszyk, Moje konto i zamówienie oraz pliki cookie woocommerce_cart_hash, woocommerce_items_in_cart, wp_woocommerce_session_, woocommerce_recently_viewed i store_notice[...]. Dla Varnisha podaje też reguły dla adresów z ?add-to-cart=.
Gdzie w praktyce pojawiają się problemy
- Inne adresy stron sklepu. Zmienili Państwo nazwę koszyka na
/moj-koszyk/albo wtyczka tłumaczeniowa tworzy/de/warenkorb/. Cache, który wyklucza stałe adresy, takie jak/cart, pominie je. Wtyczki cache, które znają WooCommerce, odczytują te strony z ustawień; cache na serwerze lub w CDN tego nie robi. - CDN, który zapisuje wszystko. Niektóre reguły CDN („cache everything”) ignorują nagłówki. W takim przypadku prosimy wyraźnie wykluczyć strony sklepu i wymienione pliki cookie.
- Wtyczka, która nadpisuje nagłówki. Wtyczka bezpieczeństwa lub przyspieszająca czasem ustawia na każdej stronie
Cache-Control: public, max-age=.... Wtedy nagłówków no-cache już nie ma. - Sesja dla każdego odwiedzającego. Zwykle WooCommerce ustawia plik cookie sesji dopiero wtedy, gdy w koszyku coś jest. Jeśli wtyczka lub motyw uruchamia sesję dla każdego odwiedzającego (plik cookie
wp_woocommerce_session_lubPHPSESSIDjuż przy pierwszej wizycie), pamięć podręczna strony przestaje działać dla wszystkich, a sklep przy dużym ruchu jest wolny. - Lokalizacja geograficzna. W WooCommerce > Ustawienia > Ogólne wybierają Państwo domyślną lokalizację klienta. Przy zwykłej opcji „Lokalizacja geograficzna” serwer ustala kraj dla każdego odwiedzającego osobno, a przy cenach zależnych od kraju nie da się tego pogodzić z pamięcią podręczną strony. Dlatego WooCommerce ma opcję „Lokalizacja geograficzna (z obsługą pamięci podręcznej strony)”, która ustala kraj przez dodatkowe zapytanie w przeglądarce. Jeśli przed złożeniem zamówienia nie potrzebują Państwo cen ani VAT zależnych od kraju, prosimy wybrać kraj sklepu: to najprostsze rozwiązanie. Na potrzeby lokalizacji geograficznej WooCommerce okresowo pobiera bazę danych MaxMind.
Na serwerze LiteSpeed (tak jak w WebOké) wtyczka LiteSpeed Cache sama obsługuje wykluczenia dla WooCommerce; prosimy sprawdzić je w ustawieniach wykluczeń. Na innych serwerach WWW i u innych dostawców hostingu działa to podobnie z inną wtyczką cache.
Czego pamięć podręczna strony nie rozwiązuje
Koszyk i zamówienie są zawsze budowane przez PHP i bazę danych. Przy dużym ruchu (promocja, newsletter) to właśnie te strony, na których Państwa klienci wydają pieniądze. Tam pomagają inne rozwiązania:
- Pamięć podręczna obiektów, taka jak Redis, przechowuje wyniki zapytań do bazy danych w pamięci. W sklepie, który ma wiele stron niemogących trafić do pamięci podręcznej strony, daje to wyraźnie więcej niż na zwykłej stronie. Hosting musi oferować Redis (w WebOké jest to możliwe, DA 15.7); następnie włączają go Państwo za pomocą wtyczki.
- Fragmenty koszyka. Klasyczne motywy aktualizują koszyk w nagłówku strony skryptem (
wc-cart-fragments), który przy niepustym koszyku wysyła dodatkowe zapytanie. Nowoczesne motywy blokowe z blokiem mini-koszyka potrzebują tego w mniejszym stopniu. Prosimy nie ładować takich skryptów na stronach, na których nic nie robią. - Uporządkowane zaplanowane działania. WooCommerce używa Action Scheduler do zadań w tle (lekcja 7.3). Zakończone działania są domyślnie usuwane po miesiącu. Jeśli lista mimo to rośnie do setek tysięcy, często przez rozszerzenie, które ciągle coś planuje, lub przez nieudane działania, zapytania do bazy danych stają się wolniejsze. Prosimy sprawdzić w WooCommerce > Status > Zaplanowane działania liczbę działań nieudanych i oczekujących.
- HPOS. Zamówienia we własnych tabelach (lekcja 1.2) sprawiają, że wyszukiwanie zamówień jest szybsze niż w starej tabeli wpisów. Istniejące sklepy muszą przejść na to rozwiązanie samodzielnie (lekcja 6.2 o kopiach zapasowych przed zmianą).
- Aktualna wersja PHP i wystarczająca ilość pamięci (lekcja 7.2).
W praktyce: tak to wygląda w WooCommerce
Prosimy sprawdzić to na przykładzie Theehuis Example w oknie prywatnym, korzystając z narzędzi deweloperskich przeglądarki (F12, karta Sieć, pierwsze żądanie):
- Strona główna, załadowana dwa razy: przy drugim razie nagłówek taki jak
x-litespeed-cache: hitlubcf-cache-status: HIT. Brak pliku cookiewp_woocommerce_session_przy pierwszej wizycie. shop.example.com/koszyk/, załadowana dwa razy: brak trafienia (hit), acache-controlzawierano-cachelubprivate.- To samo dla strony zamówienia i Moje konto.
- Prosimy dodać produkt do koszyka i załadować stronę produktu: widzą Państwo własny koszyk, a nie zapisaną wersję.
Podsumowanie
- Strony takie same dla wszystkich mogą trafiać do cache; koszyk, zamówienie i Moje konto nigdy.
- WooCommerce samo ustawia DONOTCACHEPAGE, nagłówki no-cache i pliki cookie; prosimy sprawdzić, czy nic ich nie usuwa ani nie ignoruje.
- Prosimy zwrócić uwagę na zmienione adresy, reguły CDN, wtyczki nadpisujące nagłówki, sesje dla każdego odwiedzającego i lokalizację geograficzną.
- Redis, uporządkowane zaplanowane działania, HPOS i dobra wersja PHP pomagają tam, gdzie pamięć podręczna strony nie może działać.
- Prosimy testować przez dwukrotne załadowanie strony w oknie prywatnym i odczytanie nagłówków.
Quiz
Zadanie
Zadanie A6.4: Czy koszyk i zamówienie są wyłączone z pamięci podręcznej (cache)? Prosimy podać adres sklepu oraz adresy strony koszyka i strony zamówienia (opcjonalnie także Moje konto). Program pobiera stronę główną dwa razy w odstępie 2 sekund, bez plików cookie, a następnie każdą stronę sklepu również dwa razy. Nic nie jest dodawane do koszyka ani zamawiane. Wynik zielony, jeśli strona główna przy drugim pobraniu pochodzi z cache (lub ładuje się wyraźnie szybciej) bez ustawiania pliku cookie sesji, a każda strona sklepu przy drugim pobraniu nie ma trafienia w cache i wysyła Cache-Control z no-cache, no-store, private lub max-age=0. Wynik pomarańczowy, jeśli strona główna nie korzysta z cache albo strona sklepu nie ma trafienia, ale nie ma też nagłówka no-cache. Wynik czerwony przy trafieniu w cache na stronie koszyka, zamówienia lub Moje konto albo gdy strona główna uruchamia sesję WooCommerce dla każdego odwiedzającego.
Zielony znacznik oznacza, że ta kontrola jest teraz w porządku, a nie że Państwa sklep jest bezpieczny.
Dalsza lektura
Kroki w panelu dotyczą WebOké; u innych dostawców działa to podobnie.
- Darmowy kurs WordPress 6.2: Buforowanie (cache)
- Darmowy kurs WordPress 6.3: Obrazy, PHP i inne sposoby na zwiększenie szybkości
- Instrukcja DirectAdmin 15.7: Redis
- Moja strona internetowa działa wolno lub zużywa zbyt dużo CPU: jak przyspieszyć jej działanie
- Czy to jest wyciek danych i czy muszę go zgłosić?
- Configuring caching plugins (developer.woocommerce.com, po angielsku): https://developer.woocommerce.com/docs/best-practices/performance/configuring-caching-plugins/
