2012-05-29 8 views
9

Diciamo che ho un'entità chiamata Product e questa entità viene caricata ogni volta che l'utente accede alla pagina delle informazioni sul prodotto. Normalmente salverei l'oggetto in Zend_Cache (memcache) per un'ora per evitare di colpire il db per ogni richiesta, ma per quanto ho capito non è possibile con le entità Doctrine2 a causa degli oggetti Proxy.Salvataggio di un'entità doctrine2 nella cache per accelerare il caricamento della pagina

Quindi la mia domanda è, come posso evitare di caricare la stessa entità dal database per ogni richiesta?

[EDIT]

Ho provato ad utilizzare Dottrina della cache come questo

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

ma ottengo il seguente errore

Warning: require (App/Entità/Proxy/_ CG_ /App/Entity/Category.php) [function.require]: impossibile aprire lo stream: nessun file o directory in /opt/vhosts/app/price/library/Doctrine/Common/ClassLoader.php in linea 163

Questo è lo stesso per Zend cache così come non è possibile serializzare l'entità a causa della classe Proxy

risposta

3

hai diverse opzioni:

  1. Usa Dottrina della built-in result caching
  2. Prova ad attaccare l'entità in memcache tramite Zend_Cache. Quando lo si estrae, potrebbe essere necessario unire() il Prodotto di nuovo nel EM in modo che i proxy possano essere dereferenziati. Se recuperi, unisci le associazioni necessarie per visualizzare le informazioni sul prodotto e stai facendo solo delle letture, questo shoudl funziona bene.
  3. Non memorizzare l'entità nella cache. Cache invece l'output che generi.

EDIT: Se non si preoccupano il sovraccarico idratazione, si sta utilizzando mysql, ed i vostri prodotti e le tabelle associate non cambiano molto spesso, si potrebbe preferire di fare affidamento solo sulla query mySQL cache. È un oggetto abbastanza ottuso, ma abbastanza utile da menzionare.

+0

1. Perché funzioni correttamente, devo sovrascrivere i metodi del repository come 'find',' findBy * ', giusto? 2. Vedi la mia modifica. – Optimus

0

Trovo che questo sia estremamente strano dato che mi sono limitato a questo problema e non ho riscontrato alcun problema con l'oggetto proxy memorizzato nel database. Quindi immaginiamo che la tua configurazione non sia impostata al 100%?

Se si riscontra il problema con la propria configurazione, sii molto consapevole di ciò che timdev ti ha detto DEVE unire nuovamente l'oggetto nell'EntityManager, altrimenti avrai bug strani lungo la linea.

Una quarta soluzione disponibile per te è anche quella di recuperare i dati come una matrice invece di un oggetto, ma ovviamente si perde tutta la funzionalità connessa al modulo che potrebbe non essere esattamente desiderata.

0

Mi sembra più un errore di configurazione.I proxy non sono stati generati o c'è qualcosa di sbagliato nella directory proxy e nello spazio dei nomi.

A seconda della configurazione, i proxy possono essere generati automaticamente o manualmente. I tuoi proxy sono stati effettivamente generati in App/Entity/Proxy? Questa è davvero la directory giusta?

FYI deleghe possono essere generati manualmente eseguendo doctrine orm:generate-proxies <dest-dir>

1

Si potrebbe desiderare di provare l'attuazione __sleep o __wakeup metodi per la classe entità, come Doctrine 2 ha esigenze particolari e le limitazioni in materia di serializzazione/deserializzazione di entità (che è ciò che succede quando li memorizzi in Zend_Cache).

0

In secondo piano cosa dice timdev: Doctrine dispone di cache incorporata, si desidera utilizzarlo.

Mi chiedo anche dalla domanda se si verificano problemi di prestazioni o se si è vittima di un'eccessiva ottimizzazione.

Problemi correlati