Modul 6 · 6.4
Hastighed og caching i en webshop
Modul 6: Administration og sikkerhed · Læsetid: 10 minutter
Læringsmål: Efter denne lektion kan du sætte caching op til en WooCommerce-shop, så butikken er hurtig, og personlige sider aldrig havner i cachen. Du kan også tjekke det i headerlinjerne.
Centrale begreber: sidecache, undtagelser (kurv, kasse, Min konto), cookies der går uden om cachen, no-cache-headerlinjer, DONOTCACHEPAGE, objektcache, Redis, kurvfragmenter, geolokation med sidecache, oprydning i skemalagte handlinger
To slags sider
Det grundlæggende om caching (sidecache, browsercache, objektcache, OPcache, et CDN) står i WordPress-kurset, lektion 6.2. Der står også allerede den vigtigste regel for shops: personlige sider må ikke ligge i sidecachen. Denne lektion går i dybden med det.
En shop har to slags sider:
| Slags | Eksempler | Cache |
|---|---|---|
| Ens for alle | forside, butiksside, kategorier, produktsider, informationssider | Sidecache: ja, her er den største gevinst |
| Forskellig for hver besøgende | kurv, kasse, Min konto, fortrydelsessiden med en logget ind kunde | Sidecache: aldrig |
Går det galt, ser du det med det samme: en kunde ser en andens kurv, eller værre, en andens adresse på kassesiden. Det er også et brud på persondatasikkerheden efter GDPR (KB 6749).
Hvad WooCommerce selv gør
WooCommerce hjælper en cache på tre måder. Det er godt at kende dem, så du kan se, når noget fjerner dem:
- Konstanter. På kurv, kasse og Min konto sætter WooCommerce
DONOTCACHEPAGE(og også til objekt- og databasecache). Mange cacheplugins læser den konstant og springer siden over. - Headerlinjer. På de samme sider sender WooCommerce WordPress' no-cache-headerlinjer med:
Cache-Control: no-cache, must-revalidate, max-age=0, privateog enExpiresi fortiden. En proxy eller et CDN, der følger reglerne, gemmer så ikke siden. For brugere, der er logget ind, kommerno-storemed. - Cookies. Så snart nogen lægger noget i kurven, sætter WooCommerce cookies som
woocommerce_items_in_cart,woocommerce_cart_hashogwp_woocommerce_session_.... Gode caches giver ikke længere besøgende med sådan en cookie en gemt side, heller ikke produktsider, fordi for eksempel kurven i sidehovedet så er forskellig for hver besøgende.
WooCommerce' dokumentation anbefaler til cacheplugins: undtag kurv, Min konto og kasse samt cookies woocommerce_cart_hash, woocommerce_items_in_cart, wp_woocommerce_session_, woocommerce_recently_viewed og store_notice[...]. Til Varnish giver den også regler for adresser med ?add-to-cart=.
Hvor det går galt i praksis
- Andre adresser til shopsiderne. Du har omdøbt kurven til
/mandje/, eller et oversættelsesplugin laver/de/warenkorb/. En cache, der undtager faste adresser som/cart, overser dem. Cacheplugins, der kender WooCommerce, læser siderne fra indstillingerne; en cache på serveren eller hos et CDN gør ikke. - Et CDN, der cacher alt. Nogle CDN-regler ("cache everything") ignorerer headerlinjerne. Undtag så shopsiderne og de nævnte cookies udtrykkeligt.
- Et plugin, der overskriver headerlinjerne. Et sikkerheds- eller hastighedsplugin sætter nogle gange
Cache-Control: public, max-age=...på alle sider. Så er no-cache-headerlinjerne væk. - En session for hver besøgende. Normalt sætter WooCommerce først en sessionscookie, når der ligger noget i kurven. Sætter et plugin eller tema allerede en session for hver besøgende (en cookie
wp_woocommerce_session_ellerPHPSESSIDved første besøg), forsvinder sidecachen for alle, og din shop bliver langsom, når der er travlt. - Geolokation. Under WooCommerce > Indstillinger > Generel vælger du kundens standardplacering. Med almindelig "Geolokation" beregner serveren landet for hver besøgende, og ved priser pr. land passer det ikke med en sidecache. WooCommerce har derfor indstillingen "Geolokation (med understøttelse af sidecaching)", som finder landet via en ekstra forespørgsel i browseren. Har du ikke brug for priser eller moms pr. land før kassen, så vælg butikkens land: det er det enkleste. Til geolokation downloader WooCommerce jævnligt en database fra MaxMind.
På en LiteSpeed-server (som hos WebOké) klarer pluginnet LiteSpeed Cache selv undtagelserne for WooCommerce; tjek dem i indstillingerne for undtagelser. Med andre webservere og hostingudbydere fungerer det på samme måde med et andet cacheplugin.
Hvad sidecachen ikke løser
Kurv og kasse bygges altid af PHP og databasen. Når der er travlt (et tilbud, et nyhedsbrev), er det netop de sider, hvor dine kunder bruger penge. Her hjælper andre ting:
- En objektcache som Redis gemmer resultatet af databaseforespørgsler i hukommelsen. I en shop, med mange sider der ikke kan ligge i sidecachen, giver det mærkbart mere end på et almindeligt websted. Dit webhotel skal tilbyde Redis (hos WebOké kan det, DA 15.7); derefter slår du det til med et plugin.
- Kurvfragmenter. Klassiske temaer opdaterer kurven i sidehovedet med et script (
wc-cart-fragments), der laver en ekstra forespørgsel, når kurven ikke er tom. Moderne bloktemaer med minikurv-blokken har mindre brug for det. Indlæs ikke sådanne scripts på sider, hvor de ikke gør noget. - Oprydning i skemalagte handlinger. WooCommerce bruger Action Scheduler til baggrundsopgaver (lektion 7.3). Afsluttede handlinger ryddes som standard op efter en måned. Vokser listen alligevel til hundredtusinder, ofte på grund af en udvidelse, der bliver ved med at planlægge noget, eller på grund af mislykkede handlinger, bliver databaseforespørgsler langsommere. Se under WooCommerce > Status > Skemalagte handlinger, hvor mange mislykkede og ventende handlinger der er.
- HPOS. Ordrer i egne tabeller (lektion 1.2) gør søgning i ordrer hurtigere end i den gamle indlægstabel. Eksisterende butikker skal selv skifte (lektion 6.2 om backup først).
- En aktuel PHP-version og nok hukommelse (lektion 7.2).
I praksis: sådan ser det ud i WooCommerce
Tjek det hos Tehus Example i et privat vindue med browserens udviklerværktøjer (F12, fanen Netværk, første forespørgsel):
- Forsiden, indlæst to gange: anden gang en headerlinje som
x-litespeed-cache: hitellercf-cache-status: HIT. Ingen cookiewp_woocommerce_session_ved første besøg. shop.example.com/winkelwagen/, indlæst to gange: intet hit, ogcache-controlmedno-cacheellerprivate.- Det samme for kasse og Min konto.
- Læg et produkt i kurven og indlæs en produktside: du ser din egen kurv, ikke en gemt version.
Opsummering
- Sider, der er ens for alle, i cachen; kurv, kasse og Min konto aldrig.
- WooCommerce sætter selv DONOTCACHEPAGE, no-cache-headerlinjer og cookies; tjek, at intet fjerner eller ignorerer dem.
- Pas på omdøbte adresser, CDN-regler, plugins der overskriver headerlinjer, sessioner for alle besøgende og geolokation.
- Redis, oprydning i skemalagte handlinger, HPOS og en god PHP-version hjælper, hvor sidecachen ikke kan.
- Test ved at indlæse to gange i et privat vindue og læs headerlinjerne.
Quiz
Opgave
Opgave A6.4: Bliver kurv og kasse uden for cachen? Indtast adressen på din shop og adresserne på din kurv og din kasseside (og eventuelt Min konto). Programmet henter forsiden to gange med 2 sekunders mellemrum uden cookies og derefter hver shopside også to gange. Der lægges intet i kurven, og der bestilles intet. Grøn, hvis forsiden anden gang kommer fra cachen (eller er tydeligt hurtigere) uden at sætte en sessionscookie, og hvis hver shopside anden gang ikke har et cachehit og sender en Cache-Control med no-cache, no-store, private eller max-age=0. Orange, hvis forsiden ikke bruger cache, eller hvis en shopside ikke har et hit, men heller ingen no-cache-headerlinje. Rød ved et cachehit på kurv, kasse eller Min konto, eller hvis forsiden starter en WooCommerce-session for hver besøgende.
Et grønt flueben betyder, at dette tjek er i orden nu, ikke at din shop er sikker.
Læs videre
Trin i et kontrolpanel gælder for WebOké; hos andre udbydere fungerer det på samme måde.
- Gratis WordPress-kursus 6.2: Caching
- Gratis WordPress-kursus 6.3: Billeder, PHP og andre hastighedsgevinster
- DirectAdmin vejledning 15.7: Redis
- Min hjemmeside er langsom eller bruger for meget CPU: sådan gør du den hurtigere
- Er det her et databrud, og skal jeg anmelde det?
- Configuring caching plugins (developer.woocommerce.com, engelsk): https://developer.woocommerce.com/docs/best-practices/performance/configuring-caching-plugins/
- LiteSpeed Cache til WordPress og en webshop
