Speichern einer Doktrin2-Entität zum Zwischenspeichern, um das Laden der Seite zu beschleunigen

9

Nehmen wir an, ich habe eine Entität namens Product , und diese Entität wird jedes Mal geladen, wenn ein Benutzer die Produktinformationsseite erreicht. Normalerweise würde ich das Objekt in Zend_Cache (memcache) für eine Stunde speichern, um nicht die Datenbank für jede Anfrage zu treffen, aber soweit ich weiß, ist das mit Doctrine2-Entitäten wegen der Proxy-Objekte nicht möglich.

Meine Frage ist also, wie kann ich vermeiden, dass für jede Anfrage dieselbe Entität aus der Datenbank geladen wird?

[EDIT]

Ich habe versucht Doctrine Cache so zu benutzen

%Vor%

Aber ich bekomme den folgenden Fehler

  

Warnung: require (App / Entität / Proxy / _ CG _ /App/Entity/Category.php)   [function.require]: Stream konnte nicht geöffnet werden: Keine solche Datei oder kein Verzeichnis   in /opt/vhosts/app/price/library/Doctrine/Common/ClassLoader.php auf   Zeile 163

Das ist für Zend Cache genauso, wie Sie die Entität wegen der Proxy-Klasse

nicht serialisieren können     
Optimus 29.05.2012, 19:14
quelle

5 Antworten

3

Sie haben mehrere Möglichkeiten:

  1. Verwenden Sie Doctrines erstellt -in Ergebnis-Caching
  2. Versuche einfach, Entity in Memcache über Zend_Cache zu kleben. Wenn Sie es herausziehen, müssen Sie möglicherweise das Produkt wieder in das EM zusammenführen, damit Proxys dereferenziert werden können. Wenn Sie alle Assoziationen abholen, die Sie benötigen, um die Produktinformationen anzuzeigen, und Sie nur Lesevorgänge ausführen, funktioniert das gut.
  3. Cache die Entität überhaupt nicht. Speichern Sie stattdessen die von Ihnen generierte Ausgabe.

BEARBEITEN : Wenn Ihnen der Aufwand für die Hydration nicht wichtig ist, verwenden Sie mysql, und Ihre Produkte und zugehörigen Tabellen ändern sich nicht sehr oft mySQL-Abfragecache Es ist ein ziemlich stumpfes Objekt, aber nützlich genug, um es zu erwähnen.

    
timdev 29.05.2012, 20:29
quelle
1

Sie könnten versuchen, __sleep oder __wakeup Methoden für Ihre Entitätsklasse zu implementieren, da Doctrine 2 spezielle Anforderungen und Einschränkungen bezüglich der Serialisierung / Deserialisierung von Entitäten hat (was beim Speichern in Zend_Cache passiert).

Denys Popov 10.09.2012 14:43
quelle
0

Ich finde das extrem merkwürdig, da ich mich selbst damit beschäftigt habe und keine Probleme mit dem Proxy-Objekt hatte, das in der Datenbank gespeichert wurde. Also ich rate deine Konfiguration nicht 100% Setup?

Wenn Sie das Problem mit Ihrer Konfiguration finden, dann seien Sie sich dessen sehr bewusst, was timdev Ihnen gesagt hat MÜSSEN das Objekt wieder in den EntityManager einbinden, sonst werden Sie seltsame Fehler in der Leitung haben.

Eine vierte Lösung, die für Sie verfügbar ist, besteht auch darin, die Daten als ein Array anstelle eines Objekts abzurufen, aber dann verlieren Sie natürlich alle mit Ihrem Modul verbundenen Funktionen, die möglicherweise nicht genau Ihren Vorstellungen entsprechen.

    
Antoine Hedgecock 03.08.2012 08:38
quelle
0

Es scheint mir mehr wie ein Konfigurationsfehler. Entweder wurden keine Proxies generiert oder es liegt ein Fehler mit dem Proxy-Verzeichnis und dem Namespace vor.

Abhängig von Ihrer Konfiguration können Proxies entweder automatisch oder manuell generiert werden. Wurden Ihre Proxies tatsächlich unter App/Entity/Proxy generiert? Ist das in der Tat das richtige Verzeichnis?

FYI-Proxys können manuell generiert werden, indem doctrine orm:generate-proxies <dest-dir>

ausgeführt wird     
softius 04.08.2012 16:38
quelle
0

Geben Sie an, was timdev sagt: In Doctrine ist Caching integriert, Sie möchten es verwenden.

Ich frage mich auch aus Ihrer Frage, ob Sie irgendwelche Leistungsprobleme haben oder wenn Sie Opfer einer allzu eifrigen Optimierung sind.

    
Tom 13.09.2012 07:04
quelle