Skip to content

Alt om WordPress, webutvikling — og mer til

💡 Hvordan redusere serverbelastning og øke hastigheten på WordPress med Memcached

💡 Hvordan redusere serverbelastning og øke hastigheten på WordPress med Memcached

Et WordPress-nettsted uten hurtigbufring ligner en motor som må varmes opp fra bunnen av ved hvert trafikklys. En besøkende lander på en side, PHP setter den sammen fra grunnen av og treffer databasen 30 til 60 ganger. Ti samtidige besøkende betyr tre hundre spørringer. Femti besøkende skaper et skred som får serveren til å droppe tilkoblinger raskere enn du rekker å skrive ferdig en kommando i konsollet.

Problemet er ikke WordPress i seg selv. Dynamisk sidebygging er iboende sløsende som standard; nesten alle CMS-er fungerer på denne måten. Løsningen har vært bevist gjennom årevis med drift på prosjekter med høy belastning: objektbufring i RAM via Memcached. Et riktig konfigurert Memcached-lag forvandler en server som kveles av femti samtidige brukere til en maskin som håndterer hundrevis uten et eneste millisekunds nøling i responstiden.

Vi går gjennom hele oppsettssyklusen: fra installasjon av tjenesten til en lasttest som viser forskjellen i tall. Alle kommandoer er testet på Ubuntu 22.04/24.04 og AlmaLinux 9, og er kompatible med PHP 8.2-8.5.

💡 Rask oversikt:

  • Installer Memcached-tjenesten og bind den til localhost for sikkerhet
  • Kompilér PHP memcached-utvidelsen via PECL for din PHP-versjon
  • Plasser object-cache.php drop-in-filen fra Automattic i wp-content-katalogen
  • Installer Batcache og konfigurer advanced-cache.php for sidebufring
  • Sjekk responsheadere via nettleserens DevTools
  • Kjør en lasttest med k6 og sammenlign resultater før og etter

Hva er Memcached og hvorfor WordPress trenger det

Memcached er en tjeneste som lagrer data og objekter i serverens RAM. I motsetning til filbasert hurtigbufring (WP Super Cache, W3 Total Cache, WP Rocket), som skriver ferdig HTML til disk, opererer Memcached ett nivå lavere: resultater fra databasespørringer, sammensatte menyer, widgeter og nettstedinnstillinger legges i RAM og kan hentes på mikrosekunder uten ny sammenstilling.

I praksis ser bildet slik ut. En typisk WordPress-side uten hurtigbufring gjør 30 til 60 spørringer mot MySQL. Med 50 samtidige besøkende mottar databasen mellom ett og et halvt og tre tusen spørringer, og CPU-en går i feilmodus. Memcached fanger opp det overveldende flertallet av disse spørringene på RAM-nivå: databasen hviler, CPU-en forblir ledig, og serveren svarer umiddelbart.

Teknisk sett opererer Memcached med nøkkel-verdi-par. Nøkkelen er en hash av SQL-spørringen; verdien er det serialiserte resultatet. Når WordPress setter sammen den samme siden igjen, spør den først Memcached: «Har du denne nøkkelen?» og får nesten alltid et ferdig svar uten en eneste disktilgang.

Teknologien oppsto i 2003 i LiveJournal som en løsning på ekstreme databasebelastningsproblemer. I dag kjører WordPress.com, Wikipedia, Twitter og tusenvis av prosjekter med høy belastning på Memcached. Det er modent, stabilt og forutsigbart: akkurat det produksjon trenger.

Installere Memcached-tjenesten

Vi dekker to hovedscenarier: Ubuntu (22.04/24.04) med apt og AlmaLinux / Rocky Linux 9 med dnf. Tilpass kommandoene til din distribusjon.

På Ubuntu:

1sudo apt update && sudo apt install memcached libmemcached-tools -y

På AlmaLinux / Rocky Linux 9:

1sudo dnf install memcached libmemcached -y

Etter installasjon starter tjenesten automatisk. Verifiser:

1systemctl status memcached

Som standard lytter Memcached på port 11211 på alle nettverksgrensesnitt. Dette er et sikkerhetshull: hurtigbufferen din er tilgjengelig for alle som kan nå den porten utenfra. Bind derfor tjenesten til localhost først.

Åpne konfigurasjonsfilen (/etc/memcached.conf på Ubuntu, /etc/sysconfig/memcached på AlmaLinux) og sørg for at linjen -l 127.0.0.1 er til stede og ikke kommentert ut. Start tjenesten på nytt:

1sudo systemctl restart memcached

Bygge PHP-utvidelsen via PECL

Tjenesten alene vil ikke gjøre WordPress raskere; du trenger en PHP-klient som lærer PHP å kommunisere med Memcached. Installer memcached-utvidelsen (merk: spesifikt memcached med bokstaven d, ikke memcache). Sistnevnte ble fjernet fra PHP fra og med versjon 8.0 og bør ikke brukes.

På Ubuntu, installer først byggeverktøyene. Bytt ut med din PHP-versjon: php8.4-dev, php8.3-dev eller php8.2-dev:

1sudo apt install php8.4-dev php-pear libmemcached-dev pkg-config make gcc -y

Bygg deretter utvidelsen:

1sudo pecl install memcached

På AlmaLinux / Rocky Linux 9 er oppsettet tilsvarende:

1sudo dnf install php-devel php-pear libmemcached-devel make gcc -y
2sudo pecl install memcached

Etter bygging må utvidelsen registreres i PHP. Opprett en INI-fil:

1echo "extension=memcached.so" | sudo tee /etc/php/8.4/mods-available/memcached.ini
2sudo phpenmod memcached

På AlmaLinux vil stien være en annen: /etc/php.d/memcached.ini.

Hvis du jobber i Plesk Obsidian, er dette kommandoen for å laste inn PHP-handlerne på nytt etter at utvidelsen er installert:

1plesk bin php_handler --reread

Bekreft at utvidelsen ble lastet:

1php -m | grep memcached

Utdataene skal inneholde memcached. Hvis det er tomt, sjekk stien til INI-filen og start PHP-FPM på nytt: sudo systemctl restart php8.4-fpm.

Koble WordPress til Memcached

Daemonen er installert, og PHP-utvidelsen er lastet. Nå må du koble WordPress til Memcached på applikasjonsnivå.

De facto-standarden i dag er den offisielle drop-in-filen fra Automattic: wp-memcached på GitHub. Den er skrevet av de samme utviklerne som vedlikeholder Batcache og WordPress.com, og den fungerer korrekt med PHP 8.x (inkludert 8.4 og 8.5).

Kopier filen object-cache.php fra repositoriet inn i /wp-content/-mappen på nettstedet ditt. WordPress vil automatisk oppdage den og begynne å bruke Memcached som objektbuffer-backend, uten ekstra plugins.

Hvis Memcached-porten avviker fra standardporten (11211), legg til følgende i wp-config.php:

1$memcached_servers = array(
2 array( '127.0.0.1', 11211 )
3);

Sidebufring: Batcache

Objektbufring er halve jobben. Den andre halvdelen er bufring av ferdige HTML-sider, slik at PHP ikke kjøres i det hele tatt for anonyme besøkende. Det er her Batcache kommer inn, en plugin fra Automattic som lagrer genererte sider i den samme Memcached-instansen.

Prinsippet er enkelt. En besøkende kommer til nettstedet; Batcache sjekker om det finnes en ferdig HTML-kopi av denne siden i Memcached. Hvis den finnes og ikke er utløpt, leveres den umiddelbart, og hele PHP- og MySQL-kjeden omgås. Hvis ikke, eller hvis den besøkende er innlogget, genereres siden på nytt og lagres samtidig i bufferen for påfølgende besøk.

Installasjon:

Last ned arkivet fra wordpress.org, pakk det ut, og last opp filen advanced-cache.php til roten av /wp-content/. Åpne deretter wp-config.php og legg til linjen som aktiverer mellomlagring:

1define( 'WP_CACHE', true );

Send filen batcache.php til /wp-content/plugins/ og aktiver utvidelsen i administrasjonspanelet.

Inne i advanced-cache.php finnes det omtrent et dusin innstillinger under kommentarene. De mest nyttige: max_age (sidens levetid i sekunder, standard 300 eller 5 minutter), seconds (intervall mellom regenerering av samme URL), og unique (ikke mellomlagre ulike User-Agenter separat). For de fleste nettsteder fungerer standardverdiene; juster dem bare når du forstår hvorfor.

En viktig nyanse: sørg for at define( 'WP_CACHE', true ) står FØR linjen require_once ABSPATH . 'wp-settings.php' i wp-config.php. Hvis den plasseres etter, vil ikke mellomlagring aktiveres, og WordPress vil ignorere det i stillhet.

Video: installasjon og konfigurasjon fra start til slutt

Teori er grunnlaget, men konsollkommandoer ser man best én gang. Denne videoen dekker hele syklusen for å sette opp objektmellomlagring for WordPress med Redis og Memcached, fra installasjon av tjenesten til verifisering av resultatet:

Verifisere at Memcached fungerer

Den beste testen er en praktisk en. Legg til en egendefinert header i advanced-cache.php slik at du visuelt kan se om siden ble servert fra cache eller generert på nytt.

Finn denne linjen i advanced-cache.php:

1var $headers = array();

Erstatt den med:

1var $headers = array( 'memcached' => 'activated' );

Åpne nå DevTools i nettleseren din (F12), gå til Nettverk-fanen, og last siden på nytt flere ganger. Under Response Headers vil du se et felt memcached: activated, som betyr at Batcache fungerte og siden gikk til klienten direkte fra RAM.

En ekstra metode involverer serverens kommandolinje. Vis daemon-statistikken:

1echo "stats" | nc 127.0.0.1 11211

I utdataene, se etter get_hits og get_misses. Hvis get_hits vokser når du oppdaterer nettsider i nettleseren, serverer Memcached cached-objekter pålitelig.

Lasttesting: tall, ikke inntrykk

Memcached viser sin sanne verdi under press. Den opprinnelige testen på en server med 1 kjerne og 512 MB minne ga en imponerende kontrast: uten Memcached krasjet serveren etter 15 sekunder med 50 samtidige brukere; med Memcached holdt den 400+ brukere i 50 sekunder uten en eneste feil. Dette er ikke magi, men fysikk: når CPU-en ikke bruker sykluser på å sette sammen de samme sidene på nytt, betjener den nye besøkende.

For selvtesting i dag brukes moderne verktøy. Et av de mest praktiske er k6 fra Grafana (åpen kildekode, kjører med én enkelt kommando). En grunnleggende test:

1k6 run --vus 100 --duration 30s http://your-site.com/

100 virtuelle brukere i 30 sekunder. Sammenlign resultatene med Batcache deaktivert (kommenter ut WP_CACHE) og aktivert; forskjellen i vellykkede responser og median latenstid vil måles i størrelsesordener.

For en rask sjekk uten å installere programvare, fungerer nettverktøyet Loader.io bra; gratisnivået tillater opptil 10 000 klienter per test, noe som er mer enn nok for de fleste nettsteder.

Redis eller Memcached: hva du bør velge

Spørsmålet som uunngåelig dukker opp, er hvorfor ikke Redis? Begge er nøkkel-verdi-lagre i minnet; begge fungerer med WordPress via drop-ins. Det korte svaret: for ren caching er Memcached enklere og raskere; for alt annet, Redis.

La oss sammenligne det vesentlige:

Kriterium

Memcached

Redis

Datamodell

Kun strenger

Strenger, lister, sett, hasher, geodata, pub/sub

Flertråding

Bruker alle kjerner ut av boksen

Hovedsakelig entrådet

Persistens

Ingen (rent i minnet)

RDB/AOF (lagrer til disk)

WordPress-økosystem

Automattic/wp-memcached + Batcache

Redis Object Cache (400 000+ installasjoner)

Oppsettkompleksitet

Minimal

Litt høyere

Cache-tømming ved omstart

Full (men varmes opp på minutter)

Kan bevares

For caching av WordPress-objekter er streng-basert nøkkel-verdi mer enn tilstrekkelig. De ekstra Redis-datatypene trengs ikke her. Ved get/set-operasjoner er begge begrenset av nettverksgjennomstrømning snarere enn CPU; alt annet likt er de jevnbyrdige. Memcached vinner på flertråding: den bruker alle CPU-kjerner ut av boksen, mens Redis opprettholder en overveiende entrådet arkitektur.

Velg Redis hvis du også lagrer sesjoner, oppgavekøer eller trenger persistens. For oppgaven med å «få opp farten på WordPress og avlaste databasen», leverer Memcached resultater raskere og med færre bevegelige deler.

⁉️🤔 Ofte stilte spørsmål

Trenger jeg Memcached på delt hosting?

På de fleste delte hosting-planer er Memcached utilgjengelig: leverandører gir ikke tilgang til daemonen på servernivå. Men hvis planen din inkluderer en VPS eller dedikert server, tar installasjonen 10 til 15 minutter og gir en av de mest merkbare hastighetsgevinstene blant alle WordPress-optimaliseringer. Sjekk planens muligheter i kontrollpanelet eller spør hostingsupport.

Batcache eller WP Rocket: hva er best?

WP Rocket er et multiverktøy som håndterer sidecaching (filbasert), CSS/JS-optimalisering og lazy loading. Batcache er et smalt verktøy spesifikt for Memcached-sidecaching. De konkurrerer ikke; de utfyller hverandre: Batcache fungerer på servernivå og serverer sider uten å starte PHP, mens WP Rocket opererer på applikasjonsnivå. I praksis brukes ofte begge: Batcache for anonyme besøkende, WP Rocket for finjustert optimalisering.

Hvordan tømmer jeg Memcached-cachen?

Den enkleste metoden er å starte daemonen på nytt: sudo systemctl restart memcached. Cachen vil tømmes fullstendig og begynne å varmes opp igjen ved påfølgende besøk. For målrettet tømming, bruk Query Monitor-utvidelsen: den viser innholdet i objektcachen og tillater tømming av enkeltnøkler. Det finnes også et konsollalternativ: echo "flush_all" | nc 127.0.0.1 11211.

Hvorfor ble ikke nettstedet raskere etter installasjon av object-cache.php?

Den vanligste årsaken er at PHP-utvidelsen ikke ble lastet. Sjekk php -m | grep memcached. Hvis utdataene er tomme, verifiser stien til INI-filen og start PHP-FPM på nytt. Den nest vanligste årsaken: object-cache.php ble ikke kopiert til /wp-content/ eller ble kopiert med tillatelsesfeil (den må være lesbar for brukeren som kjører PHP). Tredje: Memcached-daemonen kjører ikke; sjekk systemctl status memcached.

Kommer Memcached i konflikt med OPcache?

Nei, dette er forskjellige lag. OPcache cacher kompilert PHP-bytekode og øker hastigheten på tolkeoppstart. Memcached cacher applikasjonsdata: databasespørringsresultater. De fungerer på ulike stadier av forespørselsbehandlingen og utfyller hverandre godt. I produksjon anbefales det å bruke begge.

Kan Memcached brukes på tvers av flere servere?

Ja, dette er et av hovedscenarioene. I $memcached_servers-konfigurasjonen kan du liste opp flere IP-adresser til Memcached-daemoner, og klienten vil automatisk distribuere nøkler mellom dem. For WordPress håndterer object-cache.php-drop-in-en dette: den støtter en serverpool ut av boksen.

Bør du installere Memcached på serveren din

Å installere Memcached er ikke en universalløsning, men et av de mest effektive stegene i WordPress-optimalisering. Hvis nettstedet ditt kjører på en VPS eller dedikert server og du vil at det skal håndtere mangedobbel trafikkvekst uten å bytte ut maskinvare, installer det. Ti til femten minutter med konsollarbeid, og databasen slutter å være en flaskehals.

Hvis nettstedet er på delt hosting uten tilgang til daemonen, vurder Redis (oftere tilbudt) eller filbasert caching via WP Rocket. Hvis du allerede er på en VPS, åpne terminalen og følg stegene fra den raske oversikten ovenfor. Du vil se resultatet i din første lasttest.