Caching hiërarchieën leveren de snelste laadtijden wanneer ik elke laag specifiek gebruik: opcode, pagina, browser en edge. Ik laat in duidelijke stappen zien hoe ik deze lagen combineer, conflicten vermijd en configuraties zo instel dat requests korter worden en de TTFB zichtbaar wordt verminderd.
Centrale punten
Om ervoor te zorgen dat het overzicht duidelijk is, vat ik eerst de kernthema's samen en stem deze direct af op de prestatiedoelen. Ik leg alle niveaus uit met specifieke instellingen zodat de implementatie zonder omwegen verloopt. Ik baken dynamische onderdelen duidelijk af om personalisatie te behouden. Ik optimaliseer headers en cache keys zodat er geen onnodige verspilling in de cache is. Tot slot breng ik alles samen in een strenge keten zodat elke opvraging de snelste route neemt.
- Opcode versnelt PHP
- Pagina cache verkorte TTFB
- Browser Bespaart bandbreedte
- Rand Vermindert latentie
- Orkestratie Voorkomt conflicten
Wat betekent „caching hiërarchieën“ eigenlijk?
Ik begrijp door Hiërarchie gespreide caching van de serverkern naar het eindapparaat. Elke laag beantwoordt een andere vraag: moet de server code hercompileren, moet PHP de pagina opnieuw weergeven, moet de browser assets opnieuw laden of levert een edge node kant-en-klare content dicht bij de gebruiker. Ik voorkom dubbel werk door de niveaus te harmoniseren en duidelijke verantwoordelijkheden toe te wijzen. Op deze manier verminder ik CPU-belasting, backend queries en netwerklatentie zonder functionaliteit te verliezen. Een korte introductie van de niveaus vind je in deze compacte handleiding: Eenvoudige cachingniveaus.
Opcode caching: PHP onmiddellijk versnellen
Op Opcode-caching, ik bewaar gecompileerde PHP bytecode in RAM en bespaar mezelf herhaaldelijk parsen. Dit versnelt elk verzoek dat met PHP te maken heeft, vooral CMS-werklasten zoals WordPress. Ik schakel OPcache in en dimensioneer het geheugen royaal genoeg zodat frequente scripts nooit worden verplaatst. Ik stel gematigde revalidatie in zodat veranderingen snel zichtbaar blijven zonder dat ze te vaak worden gecontroleerd. Op deze manier verminder ik merkbaar zowel CPU-belasting als responstijden.
Ik stel de typische OPcache-parameters in php.ini opzettelijk conservatief in, controleer de hitrate en pas zo nodig aan. Ik houd het aantal versnelde bestanden hoog genoeg voor het project om er volledig in te passen. Ik gebruik preloading voor centrale classes zodat zelfs koude starts sneller verlopen. Ik implementeer veranderingen met een cache reset om het risico op inconsistente toestanden te vermijden. Ik gebruik het configuratieblok als uitgangspunt en niet als een star dogma.
opcache.enable=1
opcache.geheugen_verbruik=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=2
Ik controleer regelmatig de OPcache-statistieken, omdat alleen metingen laten zien of de cache lager is of niet. Het hosten van dashboards of PHP-statuspagina's helpt me om het aantal missers te minimaliseren. Ik vermijd geheugenwaarden die te klein zijn en leiden tot evictions. Ik vermijd ook onregelmatige validatie zodat productieve wijzigingen niet blijven hangen. Met deze balans werk ik efficiënt en veilig.
Pagina caching: HTML zonder wachttijd
Op Pagina cache Ik sla de voltooide HTML op zodat PHP en de database helemaal niet meer draaien. Dit vermindert TTFB drastisch en zorgt voor de grootste sprongen onder belasting. Gepersonaliseerde paden zoals het winkelwagentje, de kassa en gebruikersaccounts sluit ik consequent uit. Tegelijkertijd kapsel ik kleine dynamische onderdelen in via AJAX of edge-side includes zodat de rest hard uit de cache kan komen. Zo blijft de site snel zonder belangrijke individualiteit te verliezen.
Ik beslis of ik caching op serverniveau gebruik of dat ik met een plugin werk. Op de server bereik ik het beste Latency, Plugins geven me flexibele controle in het CMS. Preload-mechanismen vullen de cache vooraf zodat de eerste oproepen niet hoeven te wachten. Ik ruim verweesde items op met behulp van purge rules wanneer ik content update. Voor bijzonder dure gebieden combineer ik ook object cache zodat databasetoegang minder frequent is.
Browser caching: assets lokaal houden
Op Browser-Ik laat statische bestanden zoals afbeeldingen, CSS en JS in de lokale cache staan. Terugkerende bezoekers laden dan bijna niets en de server blijft vrij. Ik stel lange max-age waarden in voor onveranderlijke assets, die ik voorzie van bestandsnaam versiebeheer. Ik voeg korte tijden of must-revalidate toe aan dynamische endpoints zodat de app up-to-date blijft. Op deze manier verminder ik bandbreedte en optimaliseer ik de waargenomen snelheid.
Ik let op een nette mix van cache control, ETag en last-modified. Voor onveranderlijke bestanden stel ik immutable in zodat de browser niet onnodig controleert. Voor bronnen met frequente updates gebruik ik voorwaardelijke verzoeken via ETag. Ik vermijd dubbelzinnige headers, omdat tegenstrijdige signalen tot misverstanden leiden. Ik houd de controle direct in de webserver of via een CMS-plugin, afhankelijk van mijn omgeving.
Edge caching: nabijheid van de gebruiker
Over Rand-netwerken lever ik inhoud in wereldwijde PoP's, wat de latentie minimaliseert en pieken afvlakt. HTML, afbeeldingen en API's kunnen dicht bij de gebruiker worden geserveerd, afhankelijk van de set regels. Ik werk met cache keys die alleen noodzakelijke variabelen bevatten om fragmentatie te minimaliseren. Regels zoals stale-while-revalidate en stale-if-error zorgen ervoor dat gebruikers direct een geldige kopie te zien krijgen, zelfs als de Origin net aan het opwarmen is. Met name internationale doelgroepen profiteren hiervan omdat de routetijden merkbaar korter worden.
Ik scheid varianten als mobiel en desktop heel verschillend zijn. Ik laat het afreken- en accountgedeelte bewust aan de rand weg om botsingen met sessies en cookies te voorkomen. Ik controleer regelmatig de hitrate en pas TTL's aan tot de kansen optimaal zijn. Een praktische verdieping Gids voor edge caching met de nadruk op latentie en netwerkpaden. Ik houd schone zuiveringsstrategieën bij de hand zodat updates wereldwijd onmiddellijk effect hebben.
HTTP-header correct instellen
De Kop bepalen hoe ver inhoud mag reizen en wanneer het wordt gerevalideerd. Ik gebruik cachecontrole om zichtbaarheid, levensduur en revalidatieverplichtingen te bepalen. ETag identificeert een bron op een unieke manier en maakt if-none-match verzoeken mogelijk. Last-Modified biedt een fallback voor clients die ETags negeren. Ik houd de combinatie duidelijk zodat client, CDN en origin dezelfde verwachtingen hebben.
Ik gebruik het volgende overzicht als praktische referentie tijdens het configureren. Ik controleer elke regel aan de hand van het type bron en het wijzigingsgedrag. Voor statische bestanden stel ik lange max-age waarden in met immutable. Voor vaak bijgewerkte inhoud verkort ik de duur en vertrouw ik op voorwaardelijke verzoeken. Dit houdt het gegevenspad efficiënt en correct.
| Kop | Functie |
|---|---|
| Cachebeheer | Bepaalt duur, zichtbaarheid, revalidatie (bijv. max-age, public, must-revalidate) |
| ETag | Unieke identificatie van een versie, basis voor voorwaardelijke oproepen |
| Laatst gewijzigd | Tijdstempel als alternatief voor ETag, gebruikt voor validatie |
Cache-invalidatie en versheidsstrategieën
Ik ben van plan Invalidatie net zo zorgvuldig als het cachen zelf. Selectief wissen op ID, tag of pad voorkomt volledige flushes die kosten veroorzaken. Bij het implementeren zuiver ik alleen wat echt veranderd is. Stale-while-revalidate houdt gebruikers snel terwijl de achtergrond verse kopieën laadt. Stale-if-error vangt fouten op Origin op zonder de gebruikerservaring te verslechteren.
Ik combineer korte TTL met een hoge hitrate als inhoud vaak rouleert. Voor archieven, media en bibliotheken kies ik lange tijden, versiebestandsnamen en verwijder ik checkladingen. Dashboards op het CDN of de server laten me zien waar de cache buckets te klein zijn. Ik pas dan het aantal slots en objectgroottes aan. Deze constante fine-tuning maakt het verschil in het dagelijks leven.
Cache-sleutels, cookies en Vary
Met slanke Sleutels Ik houd het aantal varianten klein. Alleen parameters die het resultaat echt veranderen, komen in de sleutel terecht. Ik gebruik bewust Vary-headers, bijvoorbeeld na de Accept-Encoding- of User-Agent-klassen, als dat nodig is. Te veel cookies in de sleutel maken de cache kapot en verlagen de hitrate. Ik ruim ongebruikte cookies op en regel parameters die worden gebruikt voor tracking uit de key.
Als ik moet variëren tussen talen, valuta's of lay-outs, gebruik ik specifieke sleutels zoals lang=de of currency=EUR. Ik beperk deze variatie tot de gevallen die ik echt nodig heb. Voor A/B-tests scheid ik alleen de segmenten die verschillen in inhoud. Al het andere beheer ik aan de clientzijde of via edge logica zonder sleutelexplosie. Zo houd ik de globale cache efficiënt.
Objectcache en transiënten
A Object-Cache vermindert dure databasequery's door resultaten in het geheugen te bewaren. Voor WordPress kies ik Redis of Memcached om snelle toegang tot veelgevraagde opties, queries en sessies te garanderen. Ik gebruik transients om dure berekeningen tijdelijk op te slaan. Ik ruim deze waarden op tijdens de implementatie wanneer afhankelijkheden veranderen. Zo blijft de pagina dynamisch en toch snel.
Deze vergelijking helpt me voor projectgroottes met intensieve gegevensbelasting: Redis vs Memcached. Daar herken ik de typische sterke punten van beide systemen, afhankelijk van de werklast. Ik dimensioneer RAM en controleer uitzettingsstrategieën om ruimte te maken voor zelden gebruikte objecten. Het monitoren van hit/miss rates laat zien of de configuratie werkt. Dit niveau is een ideale aanvulling op de paginacache.
Combinatie: de geoptimaliseerde keten
Ik combineer de Niveaus zodat elk verzoek de kortste weg neemt. OPcache versnelt het genereren wanneer HTML daadwerkelijk wordt gemaakt. De paginacache biedt kant-en-klare opmaak voor anonieme bezoekers. Browser caching voorkomt herhaalde asset transfers en Edge distribueert de inhoud wereldwijd. Helemaal aan het einde is er een schone zuiverings- en versiebeheerstrategie zodat updates onmiddellijk van kracht worden.
Ik houd de volgende tabel bij de hand als spiekbriefje wanneer ik de instellingen aanpas. Ik lees de kolom „Configuratie“ als een takenlijst tijdens de implementatie. Ik zorg ervoor dat de niveaus elkaar aanvullen en elkaar niet opheffen. Dit houdt de algemene architectuur duidelijk en efficiënt. Dit overzicht voorkomt fouten tijdens het plannen.
| Cache-niveau | Voordeel | Typische inhoud | Configuratie |
|---|---|---|---|
| Opcode | Snelle PHP uitvoering | PHP bytecode | php.ini, serverpaneel |
| Pagina | Laag TTFB | Afgewerkte HTML | Serverniveau of plugin |
| Browser | Lokaal hergebruik | CSS, JS, afbeeldingen | HTTP-header, versiebeheer |
| Rand | Wereldwijde nabijheid | HTML en activa | CDN-regels, Sleutels, Zuivering |
Meting: TTFB, LCP en trefkansen
Ik meet TTFB, om te zien hoe snel de eerste byte aankomt. LCP laat me zien of de zichtbare inhoud op tijd verschijnt. Ik gebruik cache analytics om hit rates te controleren en routes te herkennen waar missers zich opstapelen. Ik correleer statistieken met implementaties, crawlerbelasting en verkeerspieken. Alleen cijfers laten zien waar ik de schroeven moet aandraaien.
Ik log responsheaders zoals Leeftijd en CF-cachestatus om successen aan de randen te visualiseren. Serverlogs vertellen me of de paginacache goed werkt. Als er grote afwijkingen zijn, zoek ik naar cookies, queryparameters of variabelen die de cache splitsen. Ik test varianten met en zonder ingelogde status. Op deze manier kan ik snel de aanpassingen vinden voor een stabiele snelheid.
Typische fouten en oplossingen
Te veel Varianten in de cache zijn een veelvoorkomend remblok. Ik beperk queryparameters in de sleutel en neutraliseer volgparameters. Een andere klassieker zijn tegenstrijdige headers, zoals no-store samen met een lange max-age. Lege of onjuiste purges kunnen ook de indruk wekken dat de cache niet werkt. Ik los zulke problemen snel op met duidelijke regels en logs.
Een ander probleem is plugins die dynamische inhoud hard gecodeerd in de HTML schrijven. Ik verplaats dergelijke elementen naar gefragmenteerde eindpunten die onafhankelijk van elkaar cachen of herladen. Cookies blokkeren vaak onbedoeld de edge cache; ik verwijder onnodige cookies in een vroeg stadium. Slechte versiebeheer dwingt browsers om steeds opnieuw te laden; ik nummer bestanden consequent. Dit houdt de pijplijn schoon en veerkrachtig.
Beslisboom: Wie reageert op een vraag?
Ik definieer een duidelijk beslissingspad om te bepalen welk niveau geleverd mag worden. Dit voorkomt onnodige origin hits en vermindert TTFB reproduceerbaar.
- 1) Is de bron onveranderlijk (bestand met versiebeheer)? Browser cache met lange max-age en onveranderlijk.
- 2) Is het verzoek anoniem, GET en zonder gevoelige cookies? Edge/page cache met public, s-maxage en stale-while-revalidate.
- 3) Bevat het verzoek Auth-Cookies, Authorisation-Header of is het POST? Oorsprong, optioneel met Object-Cache.
- 4) Bevat de URL alleen cosmetische parameters (utm, fbclid)? Ik verwijder ze uit de cache-sleutel.
- 5) Heb je kleine live onderdelen nodig (bijv. het aantal winkelmandjes)? Gefragmenteerd via AJAX of ESI.
// pseudo-logica
if (immutable_asset) return browser_cache;
if (is_get && is_anonymous && cacheable) return edge_or_page_cache;
if (needs_fragment) return cached_html + dynamic_fragment;
return origin_with_object_cache; Fragmentatie onder de knie krijgen: ESI, AJAX en gedeeltelijke rendering
Ik isoleer dynamische eilanden zodat de rest hard kan cachen. ESI is geschikt voor server-side injecties (bijv. gepersonaliseerde blokken), AJAX voor client-side herlaadpunten. Het is belangrijk dat fragmenten hun eigen, korte TTL's krijgen, zodat ze up-to-date blijven zonder het hele document ongeldig te maken.
- Statisch basisraamwerk: lange TTL, openbaar, s-maxage, stale-while-revalidate.
- Dynamisch fragment: korte TTL, must-revalidate of no-store, indien gepersonaliseerd.
- Fout: stale-if-error op de HTML-wrapper voorkomt witte pagina's.
// Voorbeeld header voor HTML-envelop
Cache-Control: public, max-age=0, s-maxage=600, stale-while-revalidate=60, stale-if-error=86400
// Voorbeeld header voor persoonlijk fragment
Cache-Control: privé, geen opslag Voorkom een stormloop op de cache en regel de opwarming
Ik voorkom kudde-effecten waarbij veel gelijktijdige missers de Origin overspoelen. Soft TTL/hard TTL, request coalescing en locking zijn mijn hulpmiddelen. Ik gebruik preloaders die sitemaps of belangrijke paden cyclisch opwarmen en TTL's spreiden zodat niet alles tegelijk verloopt.
- Zachte TTL: Een werker kan verlopen objecten vernieuwen terwijl andere consumenten nog steeds oudbakken objecten ontvangen.
- Samenvoegen: Gelijktijdige verzoeken voor dezelfde sleutel worden samengevoegd.
- Gespreide TTL's: Kritieke pagina's krijgen gespreide runtimes om zuiveringsgolven af te vlakken.
// Voorbeeld van gegradueerde runtimes
/home, /category/* -> s-maxage=900
/artikel/* -> s-maxage=1800
/search -> s-maxage=120, stale-while-revalidate=30 TTL-ontwerp netjes uitlijnen in de keten
Ik stem de browser, edge en origin TTL's zo af dat revalidatie plaatsvindt waar dat het meest gunstig is. Voor HTML vertrouw ik op s-maxage aan de rand en houd max-age laag in de browser om snelle zuiveringen te garanderen. Voor assets draai ik het om: zeer lange browser TTL's omdat versiebeheer zorgt voor actualiteit.
// HTML
Cache-Control: public, max-age=0, s-maxage=600, stale-while-revalidate=60
// Versiede activa
Cache-Control: publiek, max-age=31536000, onveranderlijk Ik vermijd tegenstrijdige specificaties zoals no-cache samen met immutable. Duidelijke regels zorgen voor consistente resultaten in de hele hiërarchie.
Compressie, HTTP/2/3 en prioritering
Ik activeer Gzip/Brotli en stel de Vary-header correct in zodat varianten netjes worden gescheiden. Met HTTP/2/3 profiteer ik van multiplexing en prioritering; dit vermindert head-of-line blocking wanneer veel assets parallel worden geladen.
# NGINX voorbeeld
gzip aan;
gzip_types text/css application/javascript application/json image/svg+xml;
brotli aan;
brotli_types text/css application/javascript application/json image/svg+xml;
add_header Vary "Accept-Encoding" altijd;
# Lange browser TTL voor assets
locatie ~* .(css|js|svg|woff2|jpg|png)$ {
verloopt 1j;
add_header Cache-Control "public, max-age=31536000, immutable";
} Authenticatie, cookies en beveiliging
Ik cache persoonlijke inhoud nooit openbaar. Ik markeer verzoeken met autorisatieheaders of sessiecookies als privé of omzeil specifiek de edge cache. Tegelijkertijd zet ik alleen essentiële cookies op de witte lijst, zodat de cachingsleutel mager blijft.
- Login/account gebieden: Cachebeheer: privé of geen opslag.
- Openbare HTML-pagina's: openbaar, s-maximum; voorkom instellen cookie.
- Cookiehygiëne: Verwijder irrelevante cookies (bijv. tracking) uit de sleutel.
// VCL-achtige logica
if (req.http.Authorisation) { return(pass); }
if (req.http.Cookie ~ "session=") { return(pass); }
// Alleen noodzakelijke cookies in de sleutel
unset req.http.Cookie: ".*";
Efficiënte caching van API- en zoekeindpunten
Ik maak een strikt onderscheid tussen methoden: GET kan in de cache, POST meestal niet. Voor frequente zoekopdrachten stel ik korte s-maxage waarden in plus stale-while-revalidate om de responstijden te verzachten. Reacties met 4xx/5xx fouten cache ik alleen kort of helemaal niet, zodat correcties direct effect hebben.
// Voorbeeld header voor openbare GET API
Cache-Control: public, max-age=0, s-maxage=120, stale-while-revalidate=30
// Cacheer fouten spaarzaam
Cachegeheugen: openbaar, s-maxage=10 Waarneembaarheid: headers, logs en TTFB-controle
Ik gebruik headerinspectie en logs om de keten transparant te maken. Leeftijd, hit/miss indicatoren en upstream status laten me zien waar tijd verloren gaat. Ik gebruik eenvoudige hulpmiddelen om TTFB reproduceerbaar te controleren en uitschieters te vinden.
Meet # TTFB
curl -o /dev/null -s -w "TTFB: %{time_starttransfer}sn" https://example.org
Controleer # header
curl -I https://example.org | sed -n '1,20p'.' # NGINX log met cache status
log_format timed '$remote_addr "$request" $status $body_bytes_sent '
$upstream_cache_status $upstream_response_time $request_time';
access_log /var/log/nginx/access.log timed; Ik vergelijk de loggegevens met implementaties en zuiveringen. Hoge miss-pieken direct na uitrol wijzen op een ontbrekende opwarming of TTL's die te kort zijn. Als Age permanent laag blijft, controleer ik of cookies onbedoeld de edge cache omzeilen.
Uitrol: versiebeheer en rolling purges
Ik bouw versies in bestandsnamen in (bijv. app.9f3c1.js) zodat browser caching agressief kan zijn. Voor HTML gebruik ik rollende zuiveringen die kritieke pagina's eerst bijwerken, gevolgd door diepte- en langlopers. Blauw/groene implementaties ontkoppelen build van release en geven me de tijd om specifiek caches op te warmen.
// Activa pijplijn
style.[hash].css
app.[hash].js
// HTML verwijst altijd naar nieuwe hashes Ik plan zuiveringsvensters buiten de piektijden en controleer de hitrate direct daarna. Op deze manier voorkom ik belastingspieken op de Origin.
Afbeeldingsvarianten, DPR en responsieve caching
Ik genereer afbeeldingsvarianten (grootte, formaat) deterministisch zodat de cache-sleutel stabiel blijft. Voor WebP/AVIF varianten scheid ik expliciet via bestandspad of parameters in plaats van alleen via Accept headers om Vary explosies te voorkomen. Voor hoge-resolutie displays (DPR) gebruik ik srcset/sizes, waardoor de browser de beste variant kan selecteren en de cache in werking kan treden voor elke specifieke asset.
<img src="img/hero-1024.jpg"
srcset="img/hero-768.jpg 768w, img/hero-1024.jpg 1024w, img/hero-1600.jpg 1600w"
sizes="(max-width: 768px) 90vw, 1024px" alt=""> Ik houd het aantal varianten per motief klein en verwijder verouderde maten uit de pijplijn zodat de cache niet versnippert.
Capaciteitsplanning: cachegeheugen en objectgroottes
Ik pas de grootte van caches aan op basis van echte toegangspatronen: een paar grote objecten (afbeeldingen, video's) vereisen andere strategieën dan veel kleine (HTML, JSON). Ik stel limieten in voor de maximale grootte van objecten en controleer of populaire objecten in het geheugen blijven. Een hoge mate van hergebruik is belangrijker dan absolute grootte; daarom trim ik sleutels, voeg ik varianten samen en voorkom ik duplicaten.
// Voorbeeld: Limieten
max_objectgrootte = 10m
standaard_ttl = 600
nuke_limit = matig (uitzettingen zonder stallen) Praktische checklist voor implementatie
Ik activeer OPcache met voldoende geheugen en controleer de hitrate. Vervolgens stel ik pagina caching in, sluit ik kritieke paden uit en laad ik belangrijke URL's vooraf. Vervolgens stel ik browserheaders in met lange tijden voor onveranderlijke bestanden en versiebeheer. In het CDN definieer ik cachingsleutels, TTL's en zuiveringsstrategieën en activeer ik stale-while-revalidate. Tot slot gebruik ik meetinstrumenten om te controleren of TTFB, LCP en edge hit rate de doelen bereiken.
Korte samenvatting
Ik gebruik Caching hiërarchisch: OPcache versnelt code, de pagina cache levert HTML, browser headers houden assets lokaal en Edge brengt content dicht bij gebruikers. Met duidelijke sleutels, geschikte TTL's en slimme invalidatie verlaag ik serverbelasting, bandbreedte en latentie. Gemeten waarden zorgen voor vooruitgang en tonen optimalisatiepotentieel. Dit creëert een betrouwbare keten van de oorsprong tot het eindapparaat. Iedereen die op zoek is naar extra details over wereldwijde levering zal in de praktijk genoeg aanknopingspunten vinden om de eigen architectuur merkbaar sneller te maken.


