Modul 6 · 6.4
Hastighet og hurtigbuffer i en nettbutikk
Modul 6: Drift og sikkerhet · Lesetid: 10 minutter
Læringsmål: Etter denne leksjonen kan du sette opp hurtigbuffer for en WooCommerce-butikk slik at butikken er rask og personlige sider aldri havner i hurtigbufferen, og du kan kontrollere det i HTTP-hodene.
Nøkkelbegreper: sidemellomlager, unntak (handlekurv, kasse, Min konto), informasjonskapsler som går forbi hurtigbufferen, no-cache-hoder, DONOTCACHEPAGE, objektbuffer, Redis, handlekurvfragmenter, geolokalisering med sidemellomlager, rydde i planlagte handlinger
To typer sider
Det grunnleggende om hurtigbuffer (sidemellomlager, nettleserbuffer, objektbuffer, OPcache, et CDN) står i WordPress-kurset, leksjon 6.2. Der står også den viktigste regelen for nettbutikker: personlige sider skal ikke i sidemellomlageret. Denne leksjonen går nærmere inn på det.
En nettbutikk har to typer sider:
| Type | Eksempler | Hurtigbuffer |
|---|---|---|
| Lik for alle | forside, butikkside, kategorier, produktsider, informasjonssider | Sidemellomlager: ja, det er her du vinner mest |
| Ulik for hver besøkende | handlekurv, kasse, Min konto, angresiden med en innlogget kunde | Sidemellomlager: aldri |
Går det galt, ser du det med en gang: en kunde ser handlekurven til en annen, eller verre, noens adresse på kassesiden. Det er også et personvernbrudd etter GDPR (KB 6749).
Hva WooCommerce allerede gjør selv
WooCommerce hjelper en hurtigbuffer på tre måter. Det er lurt å kjenne dem, så du ser når noe fjerner dem:
- Konstanter. På handlekurv, kasse og Min konto setter WooCommerce
DONOTCACHEPAGE(og tilsvarende for objekt- og databasebuffer). Mange bufferutvidelser leser denne konstanten og hopper da over siden. - HTTP-hoder. På de samme sidene sender WooCommerce med no-cache-hodene fra WordPress:
Cache-Control: no-cache, must-revalidate, max-age=0, privateog enExpiresi fortiden. En proxy eller et CDN som følger reglene, lagrer da ikke siden. For innloggede brukere kommerno-storei tillegg. - Informasjonskapsler. Så snart noen legger noe i handlekurven, setter WooCommerce informasjonskapsler som
woocommerce_items_in_cart,woocommerce_cart_hashogwp_woocommerce_session_.... Gode hurtigbuffere gir ikke lenger besøkende med en slik informasjonskapsel en lagret side, heller ikke av produktsider, fordi for eksempel handlekurven i toppen da er ulik for hver besøkende.
Dokumentasjonen fra WooCommerce sier dette om bufferutvidelser: unnta handlekurv, Min konto og kasse, og informasjonskapslene woocommerce_cart_hash, woocommerce_items_in_cart, wp_woocommerce_session_, woocommerce_recently_viewed og store_notice[...]. For Varnish gir den også regler for adresser med ?add-to-cart=.
Hvor det går galt i praksis
- Andre adresser for butikksidene. Du har gitt handlekurven et nytt navn,
/mandje/, eller en oversettelsesutvidelse lager/de/warenkorb/. En hurtigbuffer som unntar faste adresser som/cart, overser dem. Bufferutvidelser som kjenner WooCommerce, henter sidene fra innstillingene; en hurtigbuffer på serveren eller i et CDN gjør ikke det. - Et CDN som bufrer alt. Noen CDN-regler ("cache everything") ignorerer HTTP-hodene. Unnta da butikksidene og informasjonskapslene ovenfor uttrykkelig.
- En utvidelse som overskriver HTTP-hodene. En sikkerhets- eller hastighetsutvidelse setter av og til
Cache-Control: public, max-age=...på hver side. Da er no-cache-hodene borte. - En økt for hver besøkende. Normalt setter WooCommerce en øktinformasjonskapsel først når noe ligger i handlekurven. Starter en utvidelse eller et tema en økt for hver besøkende (en informasjonskapsel
wp_woocommerce_session_ellerPHPSESSIDved første besøk), forsvinner sidemellomlageret for alle, og butikken din blir treg når det er travelt. - Geolokalisering. Under WooCommerce > Innstillinger > Generelt velger du standardplasseringen til en kunde. Med vanlig "Geolokalisering" beregner serveren landet for hver besøkende, og ved priser per land passer det ikke med et sidemellomlager. WooCommerce har derfor valget "Geolokalisering (med støtte for sidemellomlagring)", som finner landet via en ekstra forespørsel i nettleseren. Trenger du ikke priser eller mva. per land før kassen, velger du butikkens land: det er enklest. For geolokalisering laster WooCommerce jevnlig ned en database fra MaxMind.
På en LiteSpeed-server (som hos WebOké) ordner utvidelsen LiteSpeed Cache selv unntakene for WooCommerce; kontroller dem i innstillingene for unntak. Hos andre webservere og leverandører fungerer det på lignende måte med en annen bufferutvidelse.
Hva sidemellomlageret ikke løser
Handlekurv og kasse bygges alltid av PHP og databasen. Når det er travelt (et tilbud, et nyhetsbrev), er det nettopp på disse sidene kundene bruker penger. Der hjelper andre ting:
- En objektbuffer som Redis lagrer resultatet av databasespørringer i minnet. I en nettbutikk, med mange sider som ikke kan ligge i sidemellomlageret, gir det merkbart mer enn på et vanlig nettsted. Hostingen din må tilby Redis (hos WebOké går det, DA 15.7); deretter slår du det på med en utvidelse.
- Handlekurvfragmenter. Klassiske temaer oppdaterer handlekurven i toppen med et skript (
wc-cart-fragments) som gjør en ekstra forespørsel når handlekurven ikke er tom. Moderne blokktemaer med miniblokk for handlekurv trenger det mindre. Ikke last slike skript på sider der de ikke gjør noe. - Ryddige planlagte handlinger. WooCommerce bruker Action Scheduler til bakgrunnsoppgaver (leksjon 7.3). Fullførte handlinger ryddes som standard bort etter en måned. Vokser listen likevel til hundretusener, ofte på grunn av en utvidelse som stadig planlegger noe eller på grunn av mislykkede handlinger, blir databasespørringene tregere. Se under WooCommerce > Status > Planlagte handlinger hvor mange handlinger som er mislykket og venter.
- HPOS. Bestillinger i egne tabeller (leksjon 1.2) gjør søk i bestillinger raskere enn i den gamle innleggstabellen. Eksisterende butikker må bytte selv (leksjon 6.2 om sikkerhetskopi først).
- En oppdatert PHP-versjon og nok minne (leksjon 7.2).
I praksis: slik ser det ut i WooCommerce
Kontroller det hos Theehuis Example i et privat vindu med utviklerverktøyene i nettleseren (F12, fanen Nettverk, første forespørsel):
- Forsiden, last inn to ganger: andre gang et hode som
x-litespeed-cache: hitellercf-cache-status: HIT. Ingen informasjonskapselwp_woocommerce_session_ved første besøk. shop.example.com/winkelwagen/, last inn to ganger: ingen hit, ogcache-controlmedno-cacheellerprivate.- Det samme for kasse og Min konto.
- Legg et produkt i handlekurven og last inn en produktside: du ser din egen handlekurv, ikke en lagret versjon.
Sammendrag
- Sider som er like for alle, i hurtigbufferen; handlekurv, kasse og Min konto aldri.
- WooCommerce setter selv DONOTCACHEPAGE, no-cache-hoder og informasjonskapsler; kontroller at ingenting fjerner eller ignorerer dem.
- Pass på nye adresser for butikksidene, CDN-regler, utvidelser som overskriver HTTP-hoder, økter for hver besøkende og geolokalisering.
- Redis, ryddige planlagte handlinger, HPOS og en god PHP-versjon hjelper der sidemellomlageret ikke kan.
- Test ved å laste inn to ganger i et privat vindu og les HTTP-hodene.
Quiz
Oppgave
Oppgave A6.4: Holdes handlekurv og kasse utenfor hurtigbufferen? Fyll inn adressen til butikken din og adressene til handlekurven og kassesiden (og eventuelt Min konto). Programmet henter forsiden to ganger med 2 sekunders mellomrom, uten informasjonskapsler, og deretter hver butikkside også to ganger. Ingenting legges i handlekurven, og ingenting bestilles. Grønt hvis forsiden andre gang kommer fra hurtigbufferen (eller er tydelig raskere) uten å sette en øktinformasjonskapsel, og hvis hver butikkside andre gang ikke har et treff i hurtigbufferen og sender en Cache-Control med no-cache, no-store, private eller max-age=0. Oransje hvis forsiden ikke bruker hurtigbuffer, eller hvis en butikkside ikke har treff, men heller ikke noe no-cache-hode. Rødt ved et treff i hurtigbufferen på handlekurv, kasse eller Min konto, eller hvis forsiden starter en WooCommerce-økt for hver besøkende.
En grønn hake betyr at denne kontrollen stemmer nå, ikke at butikken din er sikker.
Les mer
Trinn i et kontrollpanel gjelder for WebOké; hos andre leverandører fungerer det på lignende måte.
- Gratis WordPress-kurs 6.2: Caching
- Gratis WordPress-kurs 6.3: Bilder, PHP og andre hastighetsgevinster
- DirectAdmin-veiledning 15.7: Redis
- Nettstedet mitt er tregt eller bruker for mye CPU: slik gjør du det raskere
- Er dette en datalekkasje, og må jeg melde det?
- Configuring caching plugins (developer.woocommerce.com, engelsk): https://developer.woocommerce.com/docs/best-practices/performance/configuring-caching-plugins/
