Zurück zum Blog

Beschleunigen Sie das Drupal-Backend mit $settings['state_cache']

2025-08-136 Min. Lesezeit

Auf einer großen Gov Drupal-Website, an der ich arbeite, waren /admin/reports/status und /admin/config langsam. Nach der Aktivierung von $settings['state_cache'] wurden die Seiten viel schneller geladen. Redakteure bemerkten es sofort.

Wenn Ihr Admin-Bereich langsam ist, kann dies helfen. Drupal führt pro Anfrage viele kleine State API-Lesevorgänge durch, und deren Caching reduziert Datenbankzugriffe. In Drupal 10.3 können Sie es mit $settings['state_cache'] = TRUE in settings.php aktivieren. In Drupal 11 ist das State Caching standardmäßig aktiviert und die Einstellung wurde entfernt. Wenn Ihre Website eine große Anzahl großer Elemente im State speichert, überprüfen Sie dies zuerst, bevor Sie es in 10.3 aktivieren.

Was die State API speichert

Drupal speichert kleine, websitespezifische Werte in einer Key-Value-Sammlung namens state. Beispiele: letzte Cron-Zeit, Wartungs-Flags, Hilfsschalter, die von Core und Modulen verwendet werden. Ohne Caching kann jeder Lesevorgang die Datenbank treffen.

Warum state_cache hilft

Admin-Bildschirme führen viele kleine Prüfungen durch. Das Caching dieser Werte eliminiert viele Datenbankaufrufe. Das Ergebnis sind schnellere Seiten und eine geringere Datenbanklast. Einfache Änderung, klarer Gewinn.

Verfügbarkeit

  • Drupal 10.3+: Opt-in mit $settings['state_cache'].
  • Drupal 11+: Standardmäßig aktiviert; die Einstellung wurde entfernt.

Wie es funktioniert

Drupal lädt einen Wert einmal, speichert ihn im Cache und verwendet ihn bei späteren Anfragen wieder. Wenn sich ein Wert ändert, aktualisiert Drupal den Speicher und macht den Cache-Eintrag ungültig. Lesevorgänge bleiben schnell und Daten korrekt.

Aktivieren in Drupal 10.3+

Fügen Sie dies zu settings.php hinzu:

$settings['state_cache'] = TRUE;

Leeren Sie dann den Cache.

Schnelle Prüfung vor der Aktivierung

Wenn Ihre Website zu viele oder zu große Werte im state speichert, kann deren Caching Arbeitsspeicher verschwenden. Führen Sie diese Abfrage aus:

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

Sie können dasselbe mit Drush ausführen:

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

Faustregeln:

  • num_items bis etwa 100 und total_bytes um die 100 KB sind normalerweise in Ordnung.
  • Wenn Sie große Blobs sehen, verschieben Sie sie woandershin (in einen Cache-Bin, Konfiguration oder eine benutzerdefinierte Tabelle), bevor Sie sie aktivieren.

Probleme, die dies lindern kann

  • Langsame Admin-Seiten nach dem Login.
  • Hohe Datenbanklast während der redaktionellen Arbeit, Stapelverarbeitung oder intensiver Cron-Nutzung.
  • Latenzspitzen auf gemeinsam genutzten Datenbankservern.

Wenn Ihr Cache-Backend die Datenbank ist

Ja, es hilft trotzdem. Sie werden weniger Abfragen an key_value stellen. Admin-Seiten werden möglicherweise schneller geladen. Aber die Lesevorgänge treffen immer noch die Datenbank, daher sind die Gewinne geringer als bei Redis oder Memcached. Es ist sicher, es jetzt zu aktivieren und später einen Wechsel zu einem In-Memory-Cache zu planen.

Gute Kombinationen

  • Redis oder Memcached für die Cache-Speicherung, damit State-Zugriffe im Speicher erfolgen. Überprüfen Sie Ihr Cache-Backend in settings.php und beobachten Sie die Trefferraten.
  • State klein halten. Verwenden Sie es für Flags und leichtgewichtige Werte, nicht für große Blobs.
  • Vorher und nachher messen. Versuchen Sie lokal, Webprofiler oder Devel zu verwenden, um die Abfrageanzahl zu vergleichen. Verwenden Sie in der Produktion Ihr APM.

Vorbehalte

  • Sehr große State-Werte können den Cache aufblähen. Beheben Sie die Daten zuerst, dann aktivieren Sie.
  • Cache-Leerungen löschen keine State-Werte; sie machen nur zwischengespeicherte Kopien ungültig.
  • Auf Drupal 11 gibt es nichts zu konfigurieren. Sie erhalten den Gewinn bereits.

Kurze Checkliste

  1. Führen Sie die obige SQL-Prüfung durch.
  2. Entfernen Sie alle übergroßen Werte aus state.
  3. Fügen Sie auf Drupal 10.3 bis 10.x $settings['state_cache'] = TRUE; hinzu und leeren Sie den Cache.
  4. Bestätigen Sie weniger Abfragen auf Admin-Seiten und beobachten Sie, wie die Datenbanklast sinkt.

Fazit

Kleine Änderung. Spürbare Verbesserung für Redakteure. Aktivieren Sie es, testen Sie es und genießen Sie reaktionsschnellere Admin-Seiten.