web-dev-qa-db-fra.com

Comment mettre en cache dans Symfony 2?

J'ai besoin de mettre en cache certaines données spécifiques à l'application à l'aide du système de mise en cache de Symfony 2 afin de pouvoir exécuter cache:clear pour l'effacer. Tout le cache repose sur app/cache mais comment dois-je procéder pour mettre les données en cache?

http://symfony.com/doc/current/cookbook/index.html

Le seul sujet que je vois concerne la mise en cache HTML avec Varnish.

42
Tower

Si vous utilisez Doctrine utilisez déjà ces classes de cache.

Ajouter un service à config.yml:

services:
    cache:
        class: Doctrine\Common\Cache\ApcCache

Et utilisez-le dans votre contrôleur:

if ($fooString = $this->get('cache')->fetch('foo')) {
    $foo = unserialize($fooString);
} else {
    // do the work
    $this->get('cache')->save('foo', serialize($foo));
}
78
Kris Wallsmith

Utilisation simple Fournisseurs de cache de doctrine . Dans un premier temps, enregistrez le service (exemple dans config.yml):

services:
    memcached:
        class: Memcached
        calls:
            - [ addServer, ['localhost', 11211] ]
    memcached_cache:
        class: Doctrine\Common\Cache\MemcachedCache
        calls:
            - [ setMemcached, [@memcached] ]

Ensuite pour utiliser get service, par exemple dans controler:

$cache = $this->get('memcached_cache');

pour envoyer un autre service, utilisez - appels:

calls:
    - [ setCacheProvider, [@memcached_cache] ]

ou arguments:

arguments:
    - @memcached_cache

De la même manière, vous pouvez utiliser d'autres interfaces de Doctrine Cache package. Doctrine Cache fournit une interface très simple pour laquelle plusieurs implémentations prêtes à l'emploi sont fournies) :

  • ApcCache (nécessite ext/apc)
  • ArrayCache (en mémoire, durée de vie de la demande)
  • FilesystemCache (pas optimal pour une concurrence élevée)
  • MemcacheCache (nécessite ext/memcache)
  • MemcachedCache (nécessite ext/memcached)
  • PhpFileCache (pas optimal pour une concurrence élevée)
  • RedisCache.php (nécessite ext/phpredis)
  • WinCacheCache.php (nécessite ext/wincache)
  • XcacheCache.php (nécessite ext/xcache)
  • ZendDataCache.php (nécessite Zend Server Platform)

Si vous n'utilisez pas déjà Doctrine , vous devrez peut-être Bibliothèque commune pour Doctrine = projets : php composer.phar require doctrine/common ou requiert uniquement une bibliothèque de mise en cache offrant une API orientée objet pour de nombreux backends de cache : php composer.phar require doctrine/cache

Comment utiliser Doctrine Caching que vous pouvez lire dans Doctrine Common documentation sur site Web de Doctrine Project

33

Symfony 3.1 fournit un nouveau composant Cache .

10
Alsatian

Symfony2 ne fournit aucun composant pour la mise en cache de la couche application.

Comme on vous l'a déjà dit, vous pouvez utiliser la Doctrine bibliothèque de mise en cache commune http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference /caching.html

Si vous voulez quelque chose de plus avancé, vous pouvez également utiliser l'un des bundles de cache fournis par la communauté. Par exemple, le https://github.com/TheBigBrainsCompany/TbbcCacheBundle#cachebundle qui fournit des outils pour une bonne stratégie de mise en cache.

8
Benjamin

Il n'y a pas de cache partiel dans Symfony2, le cache intégré est uniquement HTTP complet. Vous devez utiliser un proxy inverse et si vous souhaitez uniquement mettre en cache un morceau de code, vous devez utiliser ESI. C'est peut-être plus de travail qu'avec symfony 1 mais les performances en valent la peine.

Quoi qu'il en soit, rien ne vous empêche d'utiliser un memcached et d'y stocker des trucs, regardez dans ce Bundle ie si comme votre question l'indique, vous n'avez que des données à stocker, c'est parfait (et un cache memcache est beaucoup plus rapide qu’un système de fichiers).

0
Damien