Ga naar inhoud

Caching

De Atraxion-webshop gebruikt Memcached als primaire cache, met een Doctrine DBAL-gebaseerde database-fallback. De cache-laag is geïmplementeerd via symfony/cache en wordt beheerd via de helperfunctie cache_create() in src/functions.php.


Cache-architectuur

Primaire adapter: Memcached

Memcached draait op memcached://localhost:11211 (of memcached://memcached:11211 in Docker). De DSN wordt geconfigureerd via de constante MEMCACHED_DSN in _www/appconfig/environment_constants.php.

De Memcached-adapter wordt aangemaakt via de Symfony Cache:

// src/functions.php:977–978
$primaryAdapter = new \Symfony\Component\Cache\Adapter\MemcachedAdapter(
    \Symfony\Component\Cache\Adapter\MemcachedAdapter::createConnection(MEMCACHED_DSN)
);

Fallback-adapter: database (cache_items-tabel)

De DoctrineDbalAdapter wordt bij elke aanroep van cache_create() altijd aangemaakt — ongeacht DISABLE_MEMCACHED:

// src/functions.php:959–961
$fallbackAdapter = new \Symfony\Component\Cache\Adapter\DoctrineDbalAdapter(
    \atx\Db::getInstance()->createDbal()
);

De constante DISABLE_MEMCACHED=1 bepaalt daarna of de fallback direct als actieve adapter wordt gebruikt, of dat er een ResilientCacheAdapter omheen gewikkeld wordt (zie hieronder).

De fallback slaat cache-items op in de tabel cache_items. Welk schema daarbij gebruikt wordt, hangt af van de DBAL-verbinding (\atx\Db::getInstance()->createDbal()) en is niet hardcoded in de cache-code zelf.

Resilient adapter

Wanneer Memcached wél beschikbaar is, combineert een ResilientCacheAdapter (src/Atraxion/Common/Cache/ResilientCacheAdapter.php) de twee adapters: bij een Memcached-fout valt hij automatisch terug op de database zonder dat de applicatie crasht (src/functions.php:982–985).

Hulpfuncties

Functie Locatie Werking
cache_create() src/functions.php:953 Retourneert de geconfigureerde adapter (singleton).
cache_get($key, $fn, $options) src/functions.php:1036 Haalt item op; als cache miss: roept $fn() aan, slaat op, retourneert.
cache_enable_warmup_mode() src/functions.php:1003 Schakelt warmup-modus in: schrijft naar zowel Memcached als database.
cache_disable_warmup_mode() src/functions.php:1014 Schakelt warmup-modus weer uit.
cache_is_using_fallback() src/functions.php:1025 Geeft aan of de fallback-adapter actief is.

Wat wordt er gecached?

De cache-warmup vult vier categorieën (src/Atraxion/Front/Command/CacheWarmupCommand.php:31–38):

Cache-categorie Klasse Inhoud
Vertalingen TranslationCache Alle rijen uit atx_www.cms_text (sleutel = namespace + varnaam)
Instellingen ConfigurationCache Alle rijen uit atx_www.setting (incl. het allSettings-item)
Taalinstellingen LanguageCache Taalconfiguratie
Klantmarges CustomerMarginCache Prijsmarges per klantgroep
Populaire artikelen ArticlePopularCustomerCategoryDAO::warmUpCache() Populairste artikelen per klantcategorie

Andere onderdelen van de applicatie gebruiken cache_get() ad hoc voor tijdelijke opslag van query-resultaten en berekeningen.


Cache-warmup

Na een fresh install, na het uitvoeren van migraties, of na wijzigingen aan vertalingen/instellingen moet de cache handmatig worden opgewarmd:

./cli.php cache:warmup
# Alias:
./cli.php c:w

De warmup-command is gedefinieerd in src/Atraxion/Front/Command/CacheWarmupCommand.php en staat geregistreerd als Symfony Console-commando met de naam cache:warmup.

Het commando:

  1. Schakelt warmup-modus in (schrijft naar zowel Memcached als database-fallback).
  2. Warmt TranslationCache, ConfigurationCache, LanguageCache, CustomerMarginCache en populaire artikelen op.
  3. Schakelt warmup-modus weer uit.
  4. Rapporteert of Memcached bereikbaar is of dat de database-fallback actief is.

Vertaling-warmup quirk

Vertalingen blijven leeg tot cache:warmup

De functie trans('key', 'namespace') (src/functions.php:567) haalt vertalingen op via de Translator-service, die de TranslationCache raadpleegt. Als de cache leeg is (bijv. na een nieuwe cms_text-migratie), retourneert trans() null en verschijnt er niets in de UI.

Oplossing: altijd ./cli.php cache:warmup uitvoeren na: - het toevoegen van nieuwe cms_text-rijen via een Doctrine-migratie - het aanpassen van bestaande vertalingen in de database

Een herstart van Memcached of de applicatieserver volstaat niet — de warmup moet expliciet worden uitgevoerd om de cache opnieuw te vullen.


Cache-modus: omgevingen

In de dev-omgeving kan Memcached worden uitgeschakeld via:

DISABLE_MEMCACHED=1 php cli.php cache:warmup

of door const DISABLE_MEMCACHED = 1; te definiëren. In dat geval gebruikt de applicatie uitsluitend de database-fallback.

In de productie-omgeving draait Memcached altijd. De ResilientCacheAdapter zorgt ervoor dat een tijdelijke Memcached-uitval (bijv. tijdens een deploy) de applicatie niet neerlegt.


Doctrine metadata-cache

DoctrineService configureert ook de metadata-cache van Doctrine ORM (_core/model/classes/atx/doctrine/DoctrineService.php:100):

$config = ORMSetup::createConfiguration(is_dev(), APP_CACHE_PATH . '/doctrine', cache_create());

In de dev-omgeving wordt de metadata-cache vervangen door een NullAdapter (zodat ORM-mapping-wijzigingen direct zichtbaar zijn zonder cache-legen, DoctrineService.php:103–105). In productie gebruikt Doctrine de geconfigureerde cache-adapter.

De cache-directory voor Doctrine-proxy's is cache/doctrine/ (vanuit APP_CACHE_PATH).