Pogrim/snowboard — pull request #33 by dmecke (2012-12-11 11:32:19+00:00)
Title: enabled apc cache for doctrine

Ich habe mich, weil ich es fuer Onlinetennis brauchte, mal ein bisschen intensiver mit dem Thema Caching bzgl. Doctrine beschaeftigt. Es gibt drei Arten von Caches:

- Metadata Cache
- Query Cache
- Result Cache

Ich habe nun alle drei aktiviert und benutze dabei APC, das bei uns auf dem Server schon installiert ist. Das ist einfach das "Tool", das dahinter steckt, vergleichbar mit Memcache.

Der Metadata Cache arbeitet durch die Aktivierung nun automatisch und sorgt dafuer, dass die Annotations an unseren Entities nicht bei jedem Seitenaufruf neu geparst werden muessen, sondern eben gecached werden. Im Live aendern sie sich ja nicht und durch ein cache:clear wird dieser Cache mit geleert, was beim Deploy bei uns automatisch passiert. Im dev sind uebrigens alle Caches deaktivert, so dass wir uns darum keine Gedanken machen muessen.

Der Query Cache sorgt dafuer, dass die vom Query Builder generierten SQL-Statements immer wieder verwendet werden koennen und nicht jedesmal neu geparst werden. Ebenso passiert das nun automatisch und nur im Live-System. Wenn Du sie also aenderst, sind diese Aenderungen im Dev-System sofort sichtbar, im Live-System nach einem cache:clear.

Der Result Cache wird NICHT automatisch verwendet. Er sorgt dafuer, dass ein Ergebnis einer Query gecached werden kann. Solange Du das aber nicht explizit angibst, passiert das auch nicht. Das funktioniert so:

```php
// src/Cunningsoft/SnowboardBundle/Repository/LeagueRespository.php
// ...
public function findLowestLeague()
{
$qb->createQueryBuilder('l');
$q = $qb->select('MAX(l.league)')
->getQuery()
->useResultCache(true, 60, 'lowestLeague');
return max(1, (int) $q->getSingleScalarResult());
}
// ...
```

Der Aufruf wird also auf das ->getQuery() aufgerufen und bekommt erstmal true, dass es gecached werden soll, dann eine Lifetime in Sekunden und dann einen Key. Der Key wird, soweit ich das bisher herausgefunden habe, aber nicht wiederverwendet, wenn unterschiedliche Parameter im Statement verwendet werden. Du brauchst also den Key nicht dynamisch zu benennen, wenn eine Query beispielsweise Daten fuer einen User holt, das macht der Befehlt schon automatisch.
Der Result Cache ist also quasi das, was Du schon manuell mit Memcache kennst - nur etwas knapper und uebersichtlicher (meine Meinung). Dementsprechend aber drauf achten, was Du cached, nicht dass die Daten aktuell sein muessen...