Torna al blog

Accelera il backend di Drupal con $settings['state_cache']

2025-08-136 min read

Su un grande sito Drupal governativo su cui lavoro, /admin/reports/status e /admin/config erano lenti. Dopo aver abilitato $settings['state_cache'], le pagine si sono caricate molto più velocemente. Gli editor se ne sono accorti subito.

Se la tua area di amministrazione risulta lenta, questo potrebbe aiutare. Drupal effettua molte piccole letture dalla State API per ogni richiesta, e la loro memorizzazione nella cache riduce i viaggi al database. In Drupal 10.3 puoi attivarla con $settings['state_cache'] = TRUE in settings.php. In Drupal 11 la memorizzazione nella cache dello stato è sempre attiva e l'impostazione è stata rimossa. Se il tuo sito memorizza un gran numero di elementi grandi nello Stato, esaminalo prima di abilitarla in 10.3.

Cosa memorizza la State API

Drupal memorizza piccoli valori specifici del sito in una raccolta chiave-valore denominata state. Esempi: ora dell'ultimo cron, flag di manutenzione, toggle di supporto utilizzati dal core e dai moduli. Senza memorizzazione nella cache, ogni lettura può accedere al database.

Perché state_cache aiuta

Le schermate di amministrazione eseguono molti piccoli controlli. La memorizzazione nella cache di questi valori elimina molte chiamate al database. Il risultato sono pagine più veloci e un minor carico sul database. Cambiamento semplice, vittoria chiara.

Disponibilità

  • Drupal 10.3+: opt-in con $settings['state_cache'].
  • Drupal 11+: attivo per impostazione predefinita; l'impostazione è stata rimossa.

Come funziona

Drupal carica un valore una volta, lo memorizza nella cache e lo riutilizza nelle richieste successive. Quando un valore cambia, Drupal aggiorna l'archiviazione e invalida la voce della cache. Le letture rimangono veloci e i dati rimangono corretti.

Abilita in Drupal 10.3+

Aggiungi questo a settings.php:

$settings['state_cache'] = TRUE;

Quindi cancella la cache.

Controllo rapido prima di abilitare

Se il tuo sito memorizza troppi o troppo grandi valori in state, la loro memorizzazione nella cache può sprecare memoria. Esegui questa query:

SELECT COUNT(*) AS num_items,
       SUM(LENGTH(value)) AS total_bytes
FROM key_value
WHERE collection = 'state';

Puoi eseguire la stessa cosa con Drush:

drush sql:query "SELECT COUNT(*) AS num_items, SUM(LENGTH(value)) AS total_bytes FROM key_value WHERE collection = 'state';"

PostgreSQL:

drush sql:query "SELECT COUNT(*) AS num_items, SUM(OCTET_LENGTH(value)) AS total_bytes FROM key_value WHERE collection = 'state';"

Regole empiriche:

  • num_items fino a circa 100 e total_bytes intorno a 100 KB va solitamente bene.
  • Se vedi blob di grandi dimensioni, spostali altrove (un bin di cache, configurazione o una tabella personalizzata) prima di abilitare.

Problemi che può alleviare

  • Pagine di amministrazione lente dopo l'accesso.
  • Elevato carico sul database durante il lavoro editoriale, l'esecuzione di batch o un uso intensivo del cron.
  • Picchi di latenza su server di database condivisi.

Se il tuo backend di cache è il database

Sì, aiuta comunque. Farai meno letture da key_value. Le pagine di amministrazione potrebbero caricarsi più velocemente. Ma le letture accedono ancora al database, quindi i guadagni sono minori rispetto a Redis o Memcached. È sicuro abilitarlo ora e pianificare una migrazione a una cache in memoria in seguito.

Buoni abbinamenti

  • Redis o Memcached per l'archiviazione della cache in modo che gli accessi allo stato risiedano in memoria. Controlla il tuo backend di cache in settings.php e osserva i rapporti di successo (hit ratios).
  • Mantieni lo stato piccolo. Usalo per flag e valori leggeri, non per blob di grandi dimensioni.
  • Misura prima e dopo. Localmente, prova Webprofiler o Devel per confrontare il numero di query. In produzione, usa il tuo APM.

Avvertenze

  • Valori di stato molto grandi possono gonfiare la cache. Correggi prima i dati, poi abilita.
  • Le cancellazioni della cache non eliminano i valori di stato; invalidano solo le copie memorizzate nella cache.
  • Su Drupal 11, non c'è nulla da configurare. Hai già il vantaggio.

Breve checklist

  1. Esegui il controllo SQL sopra.
  2. Riduci eventuali valori sovradimensionati da state.
  3. Su Drupal 10.3 fino a 10.x, aggiungi $settings['state_cache'] = TRUE; e cancella la cache.
  4. Conferma un minor numero di query sulle pagine di amministrazione e osserva la diminuzione del carico sul database.

In conclusione

Piccolo cambiamento. Miglioramento notevole per gli editor. Attivalo, testa e goditi pagine di amministrazione più reattive.