2012-05-29 16 views
9

Digamos que tengo una entidad llamada Product y esta entidad se carga cada vez que el usuario acceda a la página de información del producto. Por lo general, guardo el objeto en Zend_Cache (memcache) durante una hora para evitar golpear el DB para cada solicitud, pero por lo que yo entiendo, eso no es posible con las entidades de Doctrine2 debido a los objetos Proxy.Guardar una entidad doctrine2 en la memoria caché para acelerar la carga de la página

Entonces mi pregunta es, ¿cómo puedo evitar cargar la misma entidad de la base de datos para cada solicitud?

[EDIT]

He intentado utilizar Doctrina caché como esto

$categoryService = App_Service_Container::getService('\App\Service\Category'); 
    $cache = $categoryService->getEm()->getConfiguration()->getResultCacheImpl(); 
    $apple = $cache->fetch('apple'); 

pero me da el siguiente error

Warning: require (APP/Entidad/Proxy/_ CG _ /App/Entity/Category.php) [function.require]: no se pudo abrir la secuencia: No existe ningún archivo o directorio en /opt/vhosts/app/price/library/Doctrine/Common/ClassLoader.php en línea 163

Esto es igual para Zend Cache, así como no se puede serializar la entidad a causa de la clase Proxy

Respuesta

3

varias opciones que tenemos:

  1. uso Doctrina de built-in result caching
  2. Intenta simplemente pegar entidad en Memcache a través de Zend_Cache. Cuando lo sacas, es posible que necesites fusionar() el Producto de nuevo en el EM para que los apoderados puedan ser desreferenciados. Si busca asociaciones de asociaciones, necesita mostrar la información del producto y solo lee, este debe funcionar bien.
  3. No almacenar en caché la entidad en absoluto. Guarde en caché cualquier salida que genere en su lugar.

EDITAR: Si no se preocupan por la sobrecarga de hidratación, estás usando MySQL, y sus productos y tablas asociadas no cambian muy a menudo, es posible que prefiera confiar sólo en la consulta MySQL cache. Es un objeto bastante contundente, pero lo suficientemente útil como para mencionarlo.

+0

1. Para que esto funcione, necesito sobrescribir los métodos de repositorio como 'find',' findBy * ', ¿verdad? 2. Por favor, vea mi edición. – Optimus

0

Esto me resulta extremadamente extraño ya que me metí en esto y no tuve ningún problema con el objeto proxy que se almacena en la base de datos. ¿Así que supongo que tu configuración no está configurada al 100%?

Si encuentra el problema con su configuración, entonces sea muy consciente de lo que Timdev dijo que DEBE fusionar el objeto de nuevo en EntityManager, de lo contrario tendrá errores extraños en la línea.

Una cuarta solución disponible para usted también es recuperar los datos como una matriz en lugar de un objeto, pero luego, por supuesto, pierde toda la funcionalidad conectada a su módulo que puede no ser exactamente lo que quería.

0

Me parece más bien un error de configuración.O Proxies no se han generado o hay algo mal con el directorio proxy y el espacio de nombres.

Dependiendo de su configuración, los proxies se pueden generar automáticamente o manualmente. ¿Sus proxies se han generado de hecho bajo App/Entity/Proxy? ¿Es este el directorio correcto?

FYI proxies se pueden generar manualmente mediante la ejecución de doctrine orm:generate-proxies <dest-dir>

1

Es posible que desee para tratar de implementar __sleep o __wakeup métodos para la clase de entidad, como Doctrina 2 tiene requisitos especiales y limitaciones relativas a la serialización/deserialización de las entidades (que es lo sucede al almacenarlos en Zend_Cache).

0

Secundando lo que dice timdev: Doctrine tiene un almacenamiento en caché integrado, desea usarlo.

También me pregunto por su pregunta si tiene algún problema de rendimiento o si es víctima de una optimización excesivamente entusiasta.

Cuestiones relacionadas