Modul 6 · 6.4
Hastighet och cache i en butik
Modul 6: Förvaltning och säkerhet · Lästid: 10 minuter
Lärandemål: Efter den här lektionen kan du ställa in cache för en WooCommerce-butik så att butiken är snabb och personliga sidor aldrig hamnar i cachen. Du kan också kontrollera det i HTTP-huvudena.
Nyckelbegrepp: sidcache, undantag (varukorg, kassa, Mitt konto), cookies som går förbi cachen, no-cache-huvuden, DONOTCACHEPAGE, objektcache, Redis, varukorgsfragment, geolokalisering med sidcache, rensa schemalagda åtgärder
Två sorters sidor
Grunderna i cache (sidcache, webbläsarcache, objektcache, OPcache, ett CDN) finns i WordPress-kursen, lektion 6.2. Där står också den viktigaste regeln för butiker: personliga sidor får inte hamna i sidcachen. Den här lektionen går djupare in på det.
En butik har två sorters sidor:
| Sort | Exempel | Cache |
|---|---|---|
| Lika för alla | startsida, butikssida, kategorier, produktsidor, informationssidor | Sidcache: ja, här finns den största vinsten |
| Olika för varje besökare | varukorg, kassa, Mitt konto, ångersidan med en inloggad kund | Sidcache: aldrig |
Går det fel märks det direkt: en kund ser någon annans varukorg, eller ännu värre, någons adress på kassasidan. Det är också en personuppgiftsincident enligt GDPR (KB 6749).
Vad WooCommerce redan gör själv
WooCommerce hjälper en cache på tre sätt. Det är bra att känna till dem, så att du ser när något tar bort dem:
- Konstanter. På varukorg, kassa och Mitt konto sätter WooCommerce
DONOTCACHEPAGE(och även för objekt- och databascache). Många cachetillägg läser den konstanten och hoppar då över sidan. - Huvuden. På samma sidor skickar WooCommerce med WordPress no-cache-huvuden:
Cache-Control: no-cache, must-revalidate, max-age=0, privateoch enExpiresi det förflutna. En proxy eller ett CDN som följer reglerna sparar då inte sidan. För inloggade användare läggsno-storetill. - Cookies. Så fort någon lägger något i varukorgen sätter WooCommerce cookies som
woocommerce_items_in_cart,woocommerce_cart_hashochwp_woocommerce_session_.... Bra cacher ger inte längre besökare med en sådan cookie en sparad sida, inte heller av produktsidor, eftersom till exempel korgen i sidhuvudet då är olika för varje besökare.
WooCommerce dokumentation säger följande om cachetillägg: undanta varukorg, Mitt konto och kassa, och cookierna woocommerce_cart_hash, woocommerce_items_in_cart, wp_woocommerce_session_, woocommerce_recently_viewed och store_notice[...]. För Varnish ger den även regler för adresser med ?add-to-cart=.
Var det går fel i praktiken
- Andra adresser för butikssidorna. Du har bytt namn på varukorgen till
/mandje/eller så skapar ett översättningstillägg/de/warenkorb/. En cache som undantar fasta adresser som/cartmissar dem. Cachetillägg som känner till WooCommerce läser sidorna från inställningarna. En cache på servern eller hos ett CDN gör inte det. - Ett CDN som cachar allt. Vissa CDN-regler ("cache everything") struntar i huvudena. Undanta då butikssidorna och de nämnda cookierna uttryckligen.
- Ett tillägg som skriver över huvudena. Ett säkerhets- eller prestandatillägg sätter ibland
Cache-Control: public, max-age=...på varje sida. Då finns no-cache-huvudena inte längre kvar. - En session för varje besökare. Normalt sätter WooCommerce en sessionscookie först när det ligger något i varukorgen. Om ett tillägg eller tema startar en session redan för varje besökare (en cookie
wp_woocommerce_session_ellerPHPSESSIDvid första besöket), försvinner sidcachen för alla och butiken blir långsam när det är mycket trafik. - Geolokalisering. Under WooCommerce > Inställningar > Allmänt väljer du kundens standardplats. Med vanlig "Lokalisera" räknar servern ut landet för varje besökare, och vid priser per land passar det inte ihop med en sidcache. WooCommerce har därför alternativet "Lokalisera (med stöd för sidcachning)", som bestämmer landet via en extra förfrågan i webbläsaren. Behöver du inte priser eller moms per land före kassan, välj då butikens land: det är enklast. För geolokalisering laddar WooCommerce regelbundet ner en databas från MaxMind.
På en LiteSpeed-server (som hos WebOké) sköter tillägget LiteSpeed Cache undantagen för WooCommerce själv. Kontrollera dem i inställningarna för undantag. Hos andra webbservrar och webbhotell fungerar det på liknande sätt med ett annat cachetillägg.
Vad sidcachen inte löser
Varukorg och kassa byggs alltid upp av PHP och databasen. När det är mycket trafik (en kampanj, ett nyhetsbrev) är det just de sidorna där dina kunder spenderar pengar. Där hjälper andra saker:
- En objektcache som Redis sparar resultatet av databasfrågor i minnet. I en butik, med många sidor som inte kan ligga i sidcachen, ger det märkbart mer än på en vanlig webbplats. Ditt webbhotell måste erbjuda Redis (hos WebOké går det, DA 15.7). Sedan slår du på det med ett tillägg.
- Varukorgsfragment. Klassiska teman uppdaterar korgen i sidhuvudet med ett skript (
wc-cart-fragments) som gör en extra förfrågan när varukorgen inte är tom. Moderna blockteman med miniblocket för varukorgen behöver det mindre. Ladda inte sådana skript på sidor där de inte gör något. - Rensade schemalagda åtgärder. WooCommerce använder Action Scheduler för bakgrundsuppgifter (lektion 7.3). Slutförda åtgärder rensas som standard efter en månad. Växer listan ändå till hundratusentals, ofta på grund av ett tillägg som hela tiden schemalägger något eller på grund av misslyckade åtgärder, blir databasfrågorna långsammare. Titta under WooCommerce > Status > Schemalagda åtgärder på antalet misslyckade och väntande åtgärder.
- HPOS. Beställningar i egna tabeller (lektion 1.2) gör sökningar bland beställningar snabbare än i den gamla inläggstabellen. Befintliga butiker måste själva byta (lektion 6.2 om säkerhetskopior i förväg).
- En aktuell PHP-version och tillräckligt med minne (lektion 7.2).
I praktiken: så ser det ut i WooCommerce
Kontrollera det hos Theehuis Example i ett privat fönster med webbläsarens utvecklarverktyg (F12, fliken Nätverk, första förfrågan):
- Startsidan, ladda två gånger: andra gången ett huvud som
x-litespeed-cache: hitellercf-cache-status: HIT. Ingen cookiewp_woocommerce_session_vid första besöket. shop.example.com/winkelwagen/, ladda två gånger: ingen träff, ochcache-controlmedno-cacheellerprivate.- Samma sak för kassan och Mitt konto.
- Lägg en produkt i varukorgen och ladda en produktsida: du ser din egen korg, ingen sparad version.
Sammanfattning
- Sidor som är lika för alla ska ligga i cachen. Varukorg, kassa och Mitt konto aldrig.
- WooCommerce sätter själv DONOTCACHEPAGE, no-cache-huvuden och cookies. Kontrollera att inget tar bort eller struntar i dem.
- Se upp med omdöpta adresser, CDN-regler, tillägg som skriver över huvuden, sessioner för varje besökare och geolokalisering.
- Redis, rensade schemalagda åtgärder, HPOS och en bra PHP-version hjälper där sidcachen inte kan.
- Testa genom att ladda två gånger i ett privat fönster och läs huvudena.
Quiz
Uppgift
Uppgift A6.4: Hålls varukorgen och kassan utanför cachen? Fyll i adressen till din butik och adresserna till din varukorg och kassasida (och eventuellt Mitt konto). Programmet hämtar startsidan två gånger med 2 sekunders mellanrum, utan cookies, och sedan varje butikssida också två gånger. Inget läggs i varukorgen och inget beställs. Grönt om startsidan andra gången kommer från cachen (eller är tydligt snabbare) utan att sätta en sessionscookie, och om varje butikssida andra gången inte har någon cacheträff och skickar en Cache-Control med no-cache, no-store, private eller max-age=0. Orange om startsidan inte använder någon cache, eller om en butikssida inte har någon träff men inte heller något no-cache-huvud. Rött vid en cacheträff på varukorg, kassa eller Mitt konto, eller om startsidan startar en WooCommerce-session för varje besökare.
En grön bock betyder att den här kontrollen stämmer just nu, inte att din butik är säker.
Läs mer
Steg i en panel gäller för WebOké. Hos andra leverantörer fungerar det på liknande sätt.
- Gratis WordPress-kurs 6.2: Cachelagring
- Gratis WordPress-kurs 6.3: Bilder, PHP och annan hastighetsvinst
- DirectAdmin-guide 15.7: Redis
- Din webbplats är långsam eller använder för mycket CPU: så gör du den snabbare
- Är det här ett dataintrång och måste jag anmäla det?
- Configuring caching plugins (developer.woocommerce.com, engelska): https://developer.woocommerce.com/docs/best-practices/performance/configuring-caching-plugins/
