layout | parent | nav_order | title |
---|---|---|---|
default |
Backend |
1 |
Caching |
Met Memcached kun je de stek best wel wat versnellen. Hier wordt uitgelegd hoe je dit op Windows kan instellen. Voor linux kun je het waarschijnlijk zelf wel en anders kun je in de Docker configuratie kijken.
NOOT: Deze cache is anders dan de cache die te vinden is in var/cache/<env>
. De cache hier is alleen gebasseerd op de code en bevat bijvoorbeeld de annotaties van Symfony.
Er zijn twee caches cache.app
en doctrine.orm.second_level_cache
, de eerste is in code te gebruiken en de tweede is intern voor Doctrine. De caches zijn geconfigureerd in config/custom/memcache.yaml
en de configuratie wordt dus alleen ingeladen als memcache ondersteund wordt en geconfigureerd is.
Lees meer over de Doctrine Second Level Cache in de docs. Het komt er op neer dat je een @ORM\Cache(usage="NONSTRICT_READ_WRITE")
annotatie toevoegt aan een entity en dat dan alles automagisch werkt. Alleen de meest simpele case is geconfigureerd op dit moment (12-3-2020), dus geen regions, locks, etc.
De cache.app
cache is vrij te gebruiken en in te laden door Symfony\Contracts\Cache\CacheInterface
in de dependencies van je service te zetten, of door cache.app
uit de service container te plukken. Zie MenuItemRepository
voor een voorbeeld in het gebruik van de cache. De api is op zich best wel simpel, de uitdaging zit 'm in het netjes legen van de cache wanneer dat nodig is.
There are only two hard things in Computer Science: cache invalidation and naming things.
-- Phil Karlton
Er is geen build van de laatste versie van Memcached voor windows beschikbaar, maar een oude versie is prima. Op Syrinx draait ook een best wel oude versie.
Je kan de executable uitvoeren en dan draait er een Memcached server op localhost:11211
, zo simpel is het. Op Syrinx is memcached beschikbaar als unix socket in de data map, maar dit werkt niet echt op Windows.
Het kan handig zijn om Memcached als service te draaien, dan staat ie altijd aan en heb je er geen omkijken naar. Memcached draait standaard met een cache van 64MB en doet nauwelijks iets als hij niets te doen heeft. Je merkt er dus niets van.
Met NSSM kun je een executable als Windows service installeren. Dit werkt heel goed met Memcached.
Er zijn twee PHP extensies voor Memcached, namelijk Memcached en Memcache. Memcached is nieuwer, dus deze willen we hebben.
Je kan php_memcached.dll
en libmemcached.dll
downloaden van https://github.com/lifenglsf/php_memcached_dll op linux kun je de extensie van pecl downloaden.
Drop de php_memcached.dll
dll in de ext
map in je php installatie (C:\xampp\php\ext
, C:\wamp64\bin\php7.x.x\ext
) en de libmemcached.dll
aan de hoofdmap van php, waar ook php.exe
staat. En voeg in php.ini (C:\xampp\php\php.ini
, C:\wamp64\bin\php7.x.x\php.ini
, ...) een regel toe:
extension=memcached
Start hierna Apache opnieuw op.
Voeg de volgende regels toe aan .env.local
:
MEMCACHED_URL=memcached://localhost
Als je memcached op een unix socket draait (zoals op Syrinx gebeurt), voeg dan de volgende regels toe:
MEMCACHED_URL=memcached:///var/run/memcached.sock
Voor meer informatie over de mogelijke formaten van deze variabele, zie de Memcached Adapter documentatie.
Doordat MEMCACHED_URL
een waarde heeft en de memcache extensie is geinstalleerd wordt de configuratie voor memcache geladen. Als het niet werkt controleer dan in phpinfo of het kopje memcache bestaat.
Als je in de profiler toolbar onder het doctrine icoontje cache hits / misses ziet staan weet je dat het werkt.
Geen cache ingesteld
Wel een cache ingesteld
Bij het veranderen van database of bij het veranderen van branches die ver uit elkaar liggen kan het zijn dat wat in de cache staat niet meer klopt. Dan moet de cache geflushed worden. Dit gebeurt normaal bij iedere deploy (de data in de cache bestaat dus niet lang en kan zo verdwenen zijn).
Om de cache te flushen kun je het php bin/console stek:cache:flush
commando uitvoeren of de Memcached
service vanuit taakbeheer opnieuw opstarten.
Een goede tool om de cache te inspecteren is PHPMemcachedAdmin, hiermee kan je zien of de cache gebruikt wordt en in de cache zoeken.