Torna al blog

Come velocizzare Drupal con le cache giuste: OPcache, APCu e un backend condiviso (Redis o Memcached)

2025-08-1310 min di lettura

Se il tuo sito Drupal sembra lento, la cache è solitamente la soluzione. Non una soluzione unica, però. Diversi livelli risolvono problemi diversi. Ecco perché OPcache, APCu e un backend condiviso come Redis o Memcached compaiono spesso insieme. Ognuno accelera una parte specifica dello stack. Usali bene e Drupal diventa scattante. Usali male e continua a trascinarsi.

Attenzione: scegli un solo backend condiviso per i bin della cache di Drupal. Usa Redis o Memcached, non entrambi per gli stessi bin.

A colpo d'occhio: da fare subito vs avanzato

  • Da fare subito: Abilita OPcache in PHP. Attiva APCu per le cache locali. Scegli un backend condiviso per i bin nelle configurazioni multi-server.
  • Avanzato: Mappa bin specifici, ottimizza i timeout del client Redis, regola la dimensione degli elementi di Memcached, comprimi i valori Redis di grandi dimensioni, dimensiona i pool in base all'utilizzo effettivo.

Guida rapida alle decisioni

ConfigurazioneDa fare subitoBackend condivisoIdeale perNote
Server singoloOPcache + APCuOpzionaleSiti piccoli su un nodoLa cache del DB potrebbe andare bene. Aggiungi Redis o Memcached se il traffico aumenta.
Server multipliOPcache + APCuRedis o MemcachedCluster con bilanciamento del caricoUsa un backend condiviso per render, dynamic page cache, page, default, data.
Contenuti ad alta variabilitàOPcacheRedisTagging e invalidazione complessiLe strutture e le opzioni di persistenza aiutano.
Snello e sempliceOPcacheMemcachedCaching pura con overhead minimoMolto veloce, effimero per progettazione.

Cosa fa ogni cache

  • OPcache: Accelera PHP stesso memorizzando nella cache gli script compilati.
  • APCu: Cache locale per server, chiave-valore, per piccole ricerche.
  • Redis: Archivio dati condiviso in memoria per cache, code, lock, sessioni.
  • Memcached: Cache chiave-valore condivisa in memoria, molto semplice e veloce.

Come si integrano in Drupal

  • OPcache: Abilita a livello PHP. Non è un modulo Drupal.
  • APCu: Serve cache locali e dati di bootstrap.
  • Redis o Memcached: Mappa render, dynamic page cache, page, default, data al backend condiviso. Supporta anche sessioni, lock e code.

Correlato: Cache di stato (Drupal 10.3+, attiva per impostazione predefinita in Drupal 11). Vedi il post separato per i dettagli: Accelera il backend di Drupal con $settings['state_cache'].

Suggerimento Pro: Nelle configurazioni multi-server, mantieni bootstrap in APCu per una latenza ultra-bassa e sposta il resto nel backend condiviso.

Ricette rapide per settings.php

Copia e incolla, poi adatta.

Redis

Integrazione Drupal

$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';

Ottimizzazione delle prestazioni

// Compressione opzionale
$settings['redis_compress_length'] = 100;
$settings['redis_compress_level'] = 1;
// Timeout client (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: Registra i servizi Redis.
  • interface: Sceglie il client. PhpRedis è un'estensione nativa.
  • host/port: Specifica il target di connessione. Preferisci un socket Unix sullo stesso host.
  • cache.default: Imposta il backend predefinito per i bin non mappati.
  • bins: Mappa bin specifici a Redis.
  • compress_length/level: Comprime i valori di grandi dimensioni per risparmiare memoria.
  • timeouts/persistent: Imposta i timeout di connessione/lettura e riutilizza le connessioni.

Memcached

Integrazione Drupal

$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: Registra i servizi Memcache.
  • servers: Definisce l'elenco dei server e il nome del pool.
  • bins: Mappa i bin a un pool.
  • cache.default: Imposta il backend predefinito per i bin non mappati.

APCu per i bin locali

// Richiede il modulo backend APCu
$settings['cache']['bins']['bootstrap'] = 'cache.backend.apcu';
  • bootstrap: Mantiene i dati di bootstrap attivi nel processo per una latenza minima.

Impostazioni di runtime/server (fuori da settings.php)

Impostazioni PHP (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: Attiva OPcache per FPM o Apache.
  • opcache.enable_cli: Mantiene OPcache disattivato per la CLI.
  • opcache.memory_consumption: Alloca un pool di memoria per gli script compilati.
  • opcache.max_accelerated_files: Imposta la dimensione della tabella hash.
  • opcache.validate_timestamps: Controlla i timestamp dei file per le modifiche. Imposta a 0 per deploy build-once.
  • opcache.revalidate_freq: Imposta i secondi tra i controlli dei timestamp quando validate_timestamps = 1.
  • opcache.interned_strings_buffer: Alloca memoria per le stringhe condivise.
  • opcache.fast_shutdown: Abilita uno spegnimento più rapido della richiesta.

APCu

apc.enabled=1
apc.enable_cli=0
apc.shm_size=128M
apc.ttl=0
apc.gc_ttl=3600
  • apc.enabled: Attiva APCu per FPM.
  • apc.enable_cli: Mantiene APCu disattivato per la CLI.
  • apc.shm_size: Imposta la memoria condivisa totale.
  • apc.ttl: Imposta il TTL predefinito per le voci.
  • apc.gc_ttl: Imposta il tempo per mantenere le voci orfane.

Server Redis (redis.conf)

maxmemory 2gb
maxmemory-policy allkeys-lru
timeout 1
tcp-keepalive 60
  • maxmemory: Imposta il limite di memoria.
  • maxmemory-policy: Imposta il comportamento di espulsione quando è pieno.
  • timeout: Imposta il timeout del client inattivo in secondi.
  • tcp-keepalive: Imposta l'intervallo per i probe di keepalive.

Server Memcached (flag)

memcached -m 2048 -I 4m -f 1.25 -o slab_reassign,slab_automove
  • -m: Imposta la memoria totale in MB.
  • -I: Imposta la dimensione massima dell'elemento.
  • -f: Imposta il fattore di crescita per le classi di slab.
  • -o slab_reassign,slab_automove: Abilita il ribilanciamento degli slab.

Regole rapide di dimensionamento

CacheImpostazione chiaveRegola rapida (MB)
OPcacheopcache.memory_consumptionMB = (codebase_MB × 3) + 32
OPcacheopcache.max_accelerated_files≈ 1.5 × file PHP (usa 10000, 16229, 32531)
APCuapc.shm_sizeMB ≈ (chiavi × (byte_elemento_medio + 100) × 1.2) ÷ 1.000.000
RedismaxmemoryMB ≈ (elementi × (byte_elemento_medio + 50) × 1.3) ÷ 1.000.000
Memcached-mMB ≈ (elementi × byte_elemento_medio × 1.3) ÷ 1.000.000
Memcached-IInizia da 4 MB; aumenta se necessario

Miti comuni

  1. Mito: OPcache memorizza nella cache l'HTMLVerità: Memorizza nella cache il codice PHP compilato.
  2. Mito: APCu funziona tra serverVerità: È locale a un processo server.
  3. Mito: Redis è sempre migliore di MemcachedVerità: Scegli in base alle esigenze.
  4. Mito: Le cache miss indicano che qualcosa non vaVerità: I miss accadono e si scaldano con il traffico.

Checklist rapida di configurazione

  • OPcache:
    • Abilita l'estensione in PHP.
    • Ottimizza la dimensione della memoria e le impostazioni di rivalutazione per la produzione.
    • Assicurati che opcache.memory_consumption sia sufficiente per contenere il tuo codebase.
  • APCu:
    • Installa l'estensione PHP.
    • Conferma le impostazioni CLI e FPM se esegui entrambi.
    • Dimensiona apc.shm_size con margine per evitare espulsioni.
  • Redis:
    • Installa il server e l'estensione PHP.
    • Aggiungi il modulo Redis di Drupal e mappa i bin della cache corretti.
    • Imposta i timeout del client e considera sessioni, lock e code.
  • Memcached:
    • Installa il server e l'estensione PHP.
    • Aggiungi il modulo Memcache di Drupal e mappa i bin desiderati.
    • Imposta -I per la dimensione massima dell'elemento; assicurati che l'app tolleri la perdita della cache.

Evita queste insidie

  • Evita di mescolare Redis e Memcached per lo stesso bin.
  • Evita di sottodimensionare le cache. Monitora le espulsioni e il tasso di successo.
  • Evita l'eccesso di caching. Concentrati sui dati costosi e riutilizzabili.
  • Evita di rompere l'invalidazione. Rispetta i tag e i contesti della cache.

Come misurare il successo

  • Tendenze del tempo di risposta: Il tempo per il primo byte dovrebbe diminuire dopo il riscaldamento.
  • Carico del database: Meno query per richiesta e minore CPU sul database.
  • Rapporto di successo (hit ratio): Tieni traccia dei tassi di successo della cache. Se i tassi di successo rimangono bassi, rivedi la mappatura dei bin e i TTL.
  • Log degli errori: Monitora gli errori di connessione o i timeout da Redis o Memcached.

Considerazioni finali

Inizia con OPcache, aggiungi APCu, poi Redis o Memcached per i bin condivisi. Mantieni la semplicità, misura i risultati e ottimizza.