Hoe Drupal te versnellen met de juiste caches: OPcache, APCu en een gedeelde backend (Redis of Memcached)
Als uw Drupal-site traag aanvoelt, is caching meestal de oplossing. Niet één enkele oplossing, echter. Verschillende lagen lossen verschillende problemen op. Daarom verschijnen OPcache, APCu en een gedeelde backend zoals Redis of Memcached vaak samen. Elk versnelt een specifiek deel van de stack. Gebruik ze goed en Drupal wordt vlot. Gebruik ze slecht en het blijft slepen.
Waarschuwing: kies één gedeelde backend voor Drupal cache bins. Gebruik Redis of Memcached, niet beide voor dezelfde bins.
In één oogopslag: moet doen vs geavanceerd
- Moet doen: Schakel OPcache in PHP in. Zet APCu aan voor lokale caches. Kies één gedeelde backend voor bins op multi-server setups.
- Geavanceerd: Wijs specifieke bins toe, tune Redis client timeouts, pas Memcached itemgrootte aan, comprimeer grote Redis waarden, bepaal de grootte van pools op basis van werkelijk gebruik.
Snelle beslissingsgids
Setup | Moet doen | Gedeelde backend | Best voor | Opmerkingen |
---|---|---|---|---|
Enkele server | OPcache + APCu | Optioneel | Kleine sites op één node | DB cache is mogelijk prima. Voeg Redis of Memcached toe als het verkeer toeneemt. |
Meerdere servers | OPcache + APCu | Redis of Memcached | Load-balanced clusters | Gebruik één gedeelde backend voor render, dynamic page cache, page, default, data. |
Content met hoge variabiliteit | OPcache | Redis | Complexe tagging en invalidatie | Structuren en persistentieopties helpen. |
Lean en eenvoudig | OPcache | Memcached | Pure caching met minimale overhead | Zeer snel, vluchtig van aard. |
Wat elke cache doet
- OPcache: Versnelt PHP zelf door gecompileerde scripts te cachen.
- APCu: Lokale, per server key-value cache voor kleine lookups.
- Redis: Gedeelde in-memory datastore voor caches, wachtrijen, locks, sessies.
- Memcached: Gedeelde in-memory key-value cache, zeer eenvoudig en snel.
Hoe deze passen in Drupal
- OPcache: Inschakelen op PHP-niveau. Geen Drupal-module.
- APCu: Lokale caches en bootstrap-gegevens serveren.
- Redis of Memcached: Wijs render, dynamic page cache, page, default, data toe aan de gedeelde backend. Ondersteunt ook sessies, locks en wachtrijen.
Gerelateerd: State cache (Drupal 10.3+, standaard ingeschakeld in Drupal 11). Zie het aparte artikel voor details: Versnel de Drupal backend met $settings['state_cache']
.
Pro Tip: Houd op multi-server setups bootstrap in APCu voor ultra-lage latentie, en verplaats de rest naar de gedeelde backend.
settings.php snelle recepten
Plakken, dan aanpassen.
Redis
Drupal integratie
$settings['container_yamls'][] = 'modules/contrib/redis/redis.services.yml';
$settings['redis.connection']['interface'] = 'PhpRedis';
$settings['redis.connection']['host'] = '127.0.0.1';
$settings['redis.connection']['port'] = 6379;
$settings['cache']['default'] = 'cache.backend.redis';
$settings['cache']['bins']['render'] = 'cache.backend.redis';
$settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.redis';
$settings['cache']['bins']['page'] = 'cache.backend.redis';
Prestatie-tuning
// Optionele compressie
$settings['redis_compress_length'] = 100;
$settings['redis_compress_level'] = 1;
// Client timeouts (PhpRedis)
$settings['redis.connection']['timeout'] = 1.0;
$settings['redis.connection']['read_timeout'] = 1.0;
$settings['redis.connection']['retry_interval'] = 100;
$settings['redis.connection']['persistent'] = TRUE;
- container_yamls: Registreert Redis services.
- interface: Kiest de client. PhpRedis is een native extensie.
- host/port: Specificeert het verbindingsdoel. Geef de voorkeur aan Unix-socket op dezelfde host.
- cache.default: Stelt de standaard backend in voor niet-toegewezen bins.
- bins: Wijs specifieke bins toe aan Redis.
- compress_length/level: Comprimeert grote waarden om geheugen te besparen.
- timeouts/persistent: Stelt verbindings-/leestimeouts in en hergebruikt verbindingen.
Memcached
Drupal integratie
$settings['container_yamls'][] = 'modules/contrib/memcache/memcache.services.yml';
$settings['memcache']['servers']['127.0.0.1:11211'] = 'default';
$settings['memcache']['bins']['render'] = 'default';
$settings['memcache']['bins']['dynamic_page_cache'] = 'default';
$settings['memcache']['bins']['page'] = 'default';
$settings['cache']['default'] = 'cache.backend.memcache';
- container_yamls: Registreert Memcache services.
- servers: Definieert de serverlijst en poolnaam.
- bins: Wijs bins toe aan een pool.
- cache.default: Stelt de standaard backend in voor niet-toegewezen bins.
APCu voor lokale bins
// Vereist APCu backend module
$settings['cache']['bins']['bootstrap'] = 'cache.backend.apcu';
- bootstrap: Houdt hot bootstrap-gegevens in het proces voor de laagste latentie.
Runtime/serverinstellingen (buiten settings.php)
PHP-instellingen (php.ini)
OPcache
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=192
opcache.max_accelerated_files=16229
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.interned_strings_buffer=16
opcache.fast_shutdown=1
opcache.enable
: Schakelt OPcache in voor FPM of Apache.opcache.enable_cli
: Houdt OPcache uit voor CLI.opcache.memory_consumption
: Wijst geheugen toe voor gecompileerde scripts.opcache.max_accelerated_files
: Stelt de grootte van de hashtabel in.opcache.validate_timestamps
: Controleert bestandstijdstempels op wijzigingen. Stel in op 0 voor build-once deployments.opcache.revalidate_freq
: Stelt het aantal seconden tussen tijdstempelcontroles in wanneervalidate_timestamps
= 1.opcache.interned_strings_buffer
: Wijst geheugen toe voor gedeelde strings.opcache.fast_shutdown
: Maakt snellere request shutdown mogelijk.
APCu
apc.enabled=1
apc.enable_cli=0
apc.shm_size=128M
apc.ttl=0
apc.gc_ttl=3600
apc.enabled
: Schakelt APCu in voor FPM.apc.enable_cli
: Houdt APCu uit voor CLI.apc.shm_size
: Stelt het totale gedeelde geheugen in.apc.ttl
: Stelt de standaard TTL voor items in.apc.gc_ttl
: Stelt de tijd in om weesitems te bewaren.
Redis server (redis.conf)
maxmemory 2gb
maxmemory-policy allkeys-lru
timeout 1
tcp-keepalive 60
maxmemory
: Stelt de geheugenlimiet in.maxmemory-policy
: Stelt het verwijderingsgedrag in wanneer vol.timeout
: Stelt de idle client timeout in seconden in.tcp-keepalive
: Stelt het interval voor keepalive probes in.
Memcached server (flags)
memcached -m 2048 -I 4m -f 1.25 -o slab_reassign,slab_automove
-m
: Stelt het totale geheugen in MB in.-I
: Stelt de maximale itemgrootte in.-f
: Stelt de groeifactor voor slab-klassen in.-o slab_reassign,slab_automove
: Schakelt slab-herverdeling in.
Sizing snelle regels
Cache | Sleutelinstelling | Snelle regel (MB) |
---|---|---|
OPcache | opcache.memory_consumption | MB = (codebase_MB × 3) + 32 |
OPcache | opcache.max_accelerated_files | ≈ 1,5 × PHP-bestanden (gebruik 10000, 16229, 32531) |
APCu | apc.shm_size | MB ≈ (sleutels × (gemiddelde_item_bytes + 100) × 1,2) ÷ 1.000.000 |
Redis | maxmemory | MB ≈ (items × (gemiddelde_item_bytes + 50) × 1,3) ÷ 1.000.000 |
Memcached | -m | MB ≈ (items × gemiddelde_item_bytes × 1,3) ÷ 1.000.000 |
Memcached | -I | Begin met 4 MB; verhoog indien nodig |
Veelvoorkomende mythen
- Mythen: OPcache cacht HTML — Waarheid: Het cacht gecompileerde PHP-code.
- Mythen: APCu werkt tussen servers — Waarheid: Het is lokaal voor één serverproces.
- Mythen: Redis is altijd beter dan Memcached — Waarheid: Kies op basis van behoeften.
- Mythen: Cache misses betekenen dat er iets kapot is — Waarheid: Misses gebeuren en warmen op met verkeer.
Snelle setup checklist
- OPcache:
- Schakel de extensie in PHP in.
- Tune geheugengrootte en hervalidatie-instellingen voor productie.
- Zorg voor voldoende
opcache.memory_consumption
om uw codebase te bevatten.
- APCu:
- Installeer de PHP-extensie.
- Bevestig CLI- en FPM-instellingen als u beide uitvoert.
- Zet
apc.shm_size
met ruimte om verwijderingen te voorkomen.
- Redis:
- Installeer de server en PHP-extensie.
- Voeg de Drupal Redis-module toe en wijs de juiste cache bins toe.
- Stel client timeouts in en overweeg sessies, locks en wachtrijen.
- Memcached:
- Installeer de server en PHP-extensie.
- Voeg de Drupal Memcache-module toe en wijs de gewenste bins toe.
- Stel
-I
in voor maximale itemgrootte; zorg ervoor dat de app cacheverlies tolereert.
Vermijd deze valkuilen
- Vermijd het mengen van Redis en Memcached voor dezelfde bin.
- Vermijd onderdimensionering van caches. Houd verwijderingen en hit rate in de gaten.
- Vermijd over-caching. Concentreer u op dure, herbruikbare gegevens.
- Vermijd het breken van invalidatie. Respecteer cache tags en contexten.
Hoe succes te meten
- Responstijdtrends: De tijd tot de eerste byte moet na opwarming dalen.
- Databasebelasting: Minder queries per request en lagere CPU op de database.
- Hit ratio: Houd cache hit rates bij. Als hit rates laag blijven, controleer dan de bin-toewijzing en TTLs.
- Foutlogs: Let op verbindingsfouten of timeouts van Redis of Memcached.
Laatste gedachten
Begin met OPcache, voeg APCu toe, dan Redis of Memcached voor gedeelde bins. Houd het simpel, meet de resultaten en tune.