2012-01-17 16 views
40

Necesito almacenar en caché algunos datos específicos de la aplicación utilizando el sistema de caché de Symfony 2 para que pueda ejecutar cache:clear para borrarlo. Todo el caché depende de app/cache, pero ¿cómo realizo los datos del almacenamiento en caché?Cómo guardar en Symfony 2?

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

El único tema que veo se trata de almacenamiento en caché HTML con barniz.

+0

Symfony2 también puede hacer esto en caché internamente con la implementación de ESI. Puede parecer un poco intrincado al principio, pero hace que el paso para escalar con barniz sea mucho más pequeño. –

+0

@ Louis-PhilippeHuberdeau Estoy interesado en almacenar en caché los datos específicos de la aplicación, no la plantilla/HTML. – Tower

Respuesta

77

Si está utilizando Doctrine ya solo usa esas clases de caché.

añadir un servicio a config.yml:

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

y utilizarlo en su controlador:

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

¿Qué sucede si no estoy usando Doctrine? ¿Por qué esta parte de Doctrine? – Tower

+2

@Tower ¿Todavía no tiene respuesta para esto? – ChocoDeveloper

+1

@Tower La respuesta parece ser que Doctrine necesitaba este componente, y creó uno muy bueno para que Symfony2 no lo reinventase, pero no lo separaron en un repositorio diferente, así que aquí estamos. – ChocoDeveloper

0

No hay memoria caché parcial en Symfony2, la memoria caché incorporada es solo HTTP completa. Tiene que usar un proxy inverso, y si solo quiere almacenar en caché un fragmento de código, debe usar ESI. Es quizás más trabajo que con Symfony 1, pero las actuaciones valen la pena.

De todos modos, nada le impida utilizar un memcached y almacenar algunas cosas en él, buscar at this Bundle es decir Si como su estado de pregunta es, es suficiente con los datos a almacenar, eso es perfecto (y una caché Memcache es mucho más rápido que una sistema de archivos uno).

+3

Me interesan los datos específicos de la aplicación de caché, como los resultados computacionalmente caros, etc. Ya los estoy almacenando en caché en APC, pero ¿de qué sirve tener 2 sistemas de caché diferentes? También necesito borrar dos cachés ahora, aunque hice un comando propio que borra ambos, pero aún así. – Tower

+0

Se dice que APC no se debe usar para el almacenamiento en caché de datos (como DB) cuando se usa como caché de código de operación, ya que afecta su rendimiento. Hay un punto para usar caché por separado para almacenar datos personalizados. – forsberg

32

manera simple uso proveedores de caché Doctrina. Al principio, Servicio de Registro (muestra en config.yml):

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

Luego de usar obtener el servicio, por ejemplo en la controladora:

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

a enviar en otro uso de los servicios llama :

calls: 
    - [ setCacheProvider, [@memcached_cache] ] 

o argumentos:

arguments: 
    - @memcached_cache 

De la misma manera, puede utilizar otras interfaces del paquete Doctrine Cache. Doctrina Cache proporciona una interfaz muy simple para el que se proporcionan varios fuera de las implementaciones de la caja:

  • ApcCache (requiere ext/APC)
  • ArrayCache (en la memoria, tiempo de vida de la solicitud)
  • FilesystemCache (no óptimo para la alta concurrencia)
  • MemcacheCache (requiere ext/memcache)
  • MemcachedCache (requiere ext/memcached)
  • PhpFileCache (no óptimo para alta concurrenc y)
  • RedisCache.php (requiere ext/phpredis)
  • WinCacheCache.php (requiere ext/wincache)
  • XcacheCache.php (requiere ext/XCache)
  • ZendDataCache.php (requiere Zend Platform Servidor)

Si que aún no utiliza Doctrina, que puede requerir Biblioteca Común para los proyectos Doctrina: php composer.phar require doctrine/common o sólo requieren biblioteca de almacenamiento en caché que ofrece una API orientada a objetos para muchos backends caché: php composer.phar require doctrine/cache

Cómo utilizar Doctrina de almacenamiento en caché se puede leer en Doctrine Common documentation en Doctrine Project web site

+0

muchas gracias por esta respuesta, finalmente funciona, acabo de tener un pequeño error con YAML , parece que @memcached requiere comillas - [setMemcached, ['@memcached']] (estoy usando Symfony 3.0) – ThomasP1988

8

Symfony2 no proporciona ningún componente para el almacenamiento en caché de la capa de aplicación.

Como ya fue dicho, puede utilizar la biblioteca de almacenamiento en caché Común Doctrina http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/caching.html

Si quieres algo más avanzado, también se puede utilizar uno de los paquete de caché proporcionada por la comunidad. Por ejemplo, el https://github.com/TheBigBrainsCompany/TbbcCacheBundle#cachebundle que proporciona herramientas para una buena estrategia de almacenamiento en caché.