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:
- Schakelt warmup-modus in (schrijft naar zowel Memcached als database-fallback).
- Warmt
TranslationCache,ConfigurationCache,LanguageCache,CustomerMarginCacheen populaire artikelen op. - Schakelt warmup-modus weer uit.
- 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).