Zurück zum Blog

Wie Sie Drupal mit den richtigen Caches beschleunigen: OPcache, APCu und ein gemeinsames Backend (Redis oder Memcached)

2025-08-1310 Minuten Lesezeit

Wenn Ihre Drupal-Website langsam ist, ist Caching normalerweise die Lösung. Allerdings keine einzelne Lösung. Verschiedene Ebenen lösen unterschiedliche Probleme. Deshalb tauchen OPcache, APCu und ein gemeinsames Backend wie Redis oder Memcached oft zusammen auf. Jeder beschleunigt einen bestimmten Teil des Stacks. Nutzen Sie sie gut und Drupal wird reaktionsschnell. Nutzen Sie sie schlecht und es schleppt immer noch.

Warnung: Wählen Sie ein gemeinsames Backend für Drupal-Cache-Bins. Verwenden Sie Redis oder Memcached, nicht beides für dieselben Bins.

Auf einen Blick: Muss man tun vs. Fortgeschritten

  • Muss man tun: Aktivieren Sie OPcache in PHP. Aktivieren Sie APCu für lokale Caches. Wählen Sie ein gemeinsames Backend für Bins in Multi-Server-Setups.
  • Fortgeschritten: Ordnen Sie spezifische Bins zu, stimmen Sie Redis-Client-Timeouts ab, passen Sie die Memcached-Elementgröße an, komprimieren Sie große Redis-Werte, dimensionieren Sie Pools basierend auf der tatsächlichen Nutzung.

Schneller Entscheidungsleitfaden

SetupMuss man tunGemeinsames BackendAm besten geeignet fürHinweise
Einzelner ServerOPcache + APCuOptionalKleine Websites auf einem KnotenDB-Cache kann ausreichen. Fügen Sie Redis oder Memcached hinzu, wenn der Traffic wächst.
Mehrere ServerOPcache + APCuRedis oder MemcachedLastverteilte ClusterVerwenden Sie ein gemeinsames Backend für render, dynamic page cache, page, default, data.
Hohe Variabilität des InhaltsOPcacheRedisKomplexe Tagging- und InvalidierungsmechanismenStrukturen und Persistenzoptionen helfen.
Schlank und einfachOPcacheMemcachedReines Caching mit minimalem OverheadSehr schnell, von Natur aus flüchtig.

Was jeder Cache tut

  • OPcache: Beschleunigt PHP selbst, indem kompilierte Skripte zwischengespeichert werden.
  • APCu: Lokaler Key-Value-Cache pro Server für winzige Lookups.
  • Redis: Gemeinsamer In-Memory-Datenspeicher für Caches, Queues, Locks, Sessions.
  • Memcached: Gemeinsamer In-Memory-Key-Value-Cache, sehr einfach und schnell.

Wie diese in Drupal passen

  • OPcache: Auf der PHP-Ebene aktivieren. Kein Drupal-Modul.
  • APCu: Lokale Caches und Bootstrap-Daten bereitstellen.
  • Redis oder Memcached: Ordnen Sie render, dynamic page cache, page, default, data dem gemeinsamen Backend zu. Unterstützt auch Sessions, Locks und Queues.

Verwandt: State Cache (Drupal 10.3+, standardmäßig in Drupal 11 aktiviert). Details finden Sie im separaten Beitrag: Beschleunigen Sie das Drupal-Backend mit $settings['state_cache'].

Profi-Tipp: Behalten Sie in Multi-Server-Setups bootstrap in APCu für extrem niedrige Latenzzeiten und verschieben Sie den Rest in das gemeinsame Backend.

settings.php Schnellrezepte

Einfügen und dann anpassen.

Redis

Drupal-Integration

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

Performance-Tuning

// Optionale Komprimierung
$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: Registriert Redis-Dienste.
  • interface: Wählt den Client aus. PhpRedis ist eine native Erweiterung.
  • host/port: Gibt das Verbindungsziel an. Bevorzugen Sie einen Unix-Socket auf demselben Host.
  • cache.default: Legt das Standard-Backend für nicht zugeordnete Bins fest.
  • bins: Ordnet spezifische Bins Redis zu.
  • compress_length/level: Komprimiert große Werte, um Speicher zu sparen.
  • timeouts/persistent: Legt Verbindungs-/Lese-Timeouts fest und gibt Verbindungen wieder.

Memcached

Drupal-Integration

$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: Registriert Memcache-Dienste.
  • servers: Definiert die Serverliste und den Poolnamen.
  • bins: Ordnet Bins einem Pool zu.
  • cache.default: Legt das Standard-Backend für nicht zugeordnete Bins fest.

APCu für lokale Bins

// Erfordert das APCu-Backend-Modul
$settings['cache']['bins']['bootstrap'] = 'cache.backend.apcu';
  • bootstrap: Hält heiße Bootstrap-Daten im Prozess für geringste Latenz.

Laufzeit-/Servereinstellungen (außerhalb von settings.php)

PHP-Einstellungen (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: Schaltet OPcache für FPM oder Apache ein.
  • opcache.enable_cli: Hält OPcache für CLI ausgeschaltet.
  • opcache.memory_consumption: Weist einen Speicherpool für kompilierte Skripte zu.
  • opcache.max_accelerated_files: Legt die Größe der Hashtabelle fest.
  • opcache.validate_timestamps: Überprüft Dateizeitstempel auf Änderungen. Auf 0 für Build-Once-Deployments setzen.
  • opcache.revalidate_freq: Legt die Sekunden zwischen Zeitstempelprüfungen fest, wenn validate_timestamps = 1 ist.
  • opcache.interned_strings_buffer: Weist Speicher für gemeinsam genutzte Zeichenketten zu.
  • opcache.fast_shutdown: Ermöglicht eine schnellere Anforderungsbeendigung.

APCu

apc.enabled=1
apc.enable_cli=0
apc.shm_size=128M
apc.ttl=0
apc.gc_ttl=3600
  • apc.enabled: Schaltet APCu für FPM ein.
  • apc.enable_cli: Hält APCu für CLI ausgeschaltet.
  • apc.shm_size: Legt den gesamten gemeinsam genutzten Speicher fest.
  • apc.ttl: Legt die Standard-TTL für Einträge fest.
  • apc.gc_ttl: Legt fest, wie lange verwaiste Einträge aufbewahrt werden.

Redis-Server (redis.conf)

maxmemory 2gb
maxmemory-policy allkeys-lru
timeout 1
tcp-keepalive 60
  • maxmemory: Legt die Speichergrenze fest.
  • maxmemory-policy: Legt das Evictions-Verhalten fest, wenn der Speicher voll ist.
  • timeout: Legt die Leerlauf-Client-Zeitüberschreitung in Sekunden fest.
  • tcp-keepalive: Legt das Intervall für Keepalive-Sonden fest.

Memcached-Server (Flags)

memcached -m 2048 -I 4m -f 1.25 -o slab_reassign,slab_automove
  • -m: Legt den gesamten Speicher in MB fest.
  • -I: Legt die maximale Elementgröße fest.
  • -f: Legt den Wachstumsfaktor für Slab-Klassen fest.
  • -o slab_reassign,slab_automove: Aktiviert die Slab-Neuzuordnung.

Schnelle Regeln zur Dimensionierung

CacheSchlüsseleinstellungSchnelle Regel (MB)
OPcacheopcache.memory_consumptionMB = (Codebasis_MB × 3) + 32
OPcacheopcache.max_accelerated_files≈ 1,5 × PHP-Dateien (verwenden Sie 10000, 16229, 32531)
APCuapc.shm_sizeMB ≈ (Schlüssel × (durchschnittliche_Elementgröße_Bytes + 100) × 1,2) ÷ 1.000.000
RedismaxmemoryMB ≈ (Elemente × (durchschnittliche_Elementgröße_Bytes + 50) × 1,3) ÷ 1.000.000
Memcached-mMB ≈ (Elemente × durchschnittliche_Elementgröße_Bytes × 1,3) ÷ 1.000.000
Memcached-IBeginnen Sie mit 4 MB; erhöhen Sie bei Bedarf

Gängige Mythen

  1. Mythos: OPcache speichert HTML zwischenWahrheit: Es speichert kompilierten PHP-Code zwischen.
  2. Mythos: APCu funktioniert serverübergreifendWahrheit: Es ist lokal auf einen Serverprozess beschränkt.
  3. Mythos: Redis ist immer besser als MemcachedWahrheit: Wählen Sie basierend auf den Anforderungen.
  4. Mythos: Cache-Misses bedeuten, dass etwas kaputt istWahrheit: Misses passieren und wärmen sich mit dem Traffic auf.

Schnelle Einrichtungscheckliste

  • OPcache:
    • Aktivieren Sie die Erweiterung in PHP.
    • Passen Sie Speichergröße und Revalidierungseinstellungen für die Produktion an.
    • Stellen Sie sicher, dass opcache.memory_consumption ausreicht, um Ihre Codebasis zu speichern.
  • APCu:
    • Installieren Sie die PHP-Erweiterung.
    • Bestätigen Sie CLI- und FPM-Einstellungen, wenn Sie beides ausführen.
    • Dimensionieren Sie apc.shm_size mit Spielraum, um Evictions zu vermeiden.
  • Redis:
    • Installieren Sie den Server und die PHP-Erweiterung.
    • Fügen Sie das Drupal Redis-Modul hinzu und ordnen Sie die richtigen Cache-Bins zu.
    • Legen Sie Client-Timeouts fest und berücksichtigen Sie Sessions, Locks und Queues.
  • Memcached:
    • Installieren Sie den Server und die PHP-Erweiterung.
    • Fügen Sie das Drupal Memcache-Modul hinzu und ordnen Sie die gewünschten Bins zu.
    • Legen Sie -I für die maximale Elementgröße fest; stellen Sie sicher, dass die Anwendung Cache-Verlust toleriert.

Vermeiden Sie diese Fallen

  • Vermeiden Sie es, Redis und Memcached für denselben Bin zu mischen.
  • Vermeiden Sie Unterdimensionierung von Caches. Achten Sie auf Evictions und Trefferraten.
  • Vermeiden Sie Über-Caching. Konzentrieren Sie sich auf teure, wiederverwendbare Daten.
  • Vermeiden Sie die Beschädigung der Invalidierung. Beachten Sie Cache-Tags und Kontexte.

So messen Sie den Erfolg

  • Antwortzeit-Trends: Die Zeit bis zum ersten Byte sollte nach dem Aufwärmen sinken.
  • Datenbanklast: Weniger Abfragen pro Anfrage und geringere CPU-Auslastung der Datenbank.
  • Trefferrate: Verfolgen Sie die Cache-Trefferraten. Wenn die Trefferraten niedrig bleiben, überprüfen Sie die Bin-Zuordnung und die TTLs.
  • Fehlerprotokolle: Achten Sie auf Verbindungsfehler oder Timeouts von Redis oder Memcached.

Abschließende Gedanken

Beginnen Sie mit OPcache, fügen Sie APCu hinzu und dann Redis oder Memcached für gemeinsame Bins. Halten Sie es einfach, messen Sie die Ergebnisse und optimieren Sie.