Frage

Kürzlich habe ich Doctrine 2 Orm in Codesigniter 2. integriert. Innerhalb einer Seite I instanziieren Sie die Lehre Entitätsmanager auf folgende Weise:

private static $em = null;

public function __construct() {
    parent::__construct();
    $this->em = $this->doctrine->em;
}

Und dann fange ich bei Bedarf mit dem Entity -Manager an. Das Problem, das ich habe, ist, dass in jeder Seite die Anfrage des Entitätsmanagers einige Zeit in der Initialisierung benötigt (Genehmigung 1 Sekunde). Dadurch warten der Benutzer, bis die Seite geladen ist. Im Folgenden finden Sie einige Leistungsergebnisse, die ich gemessen habe:

BENCHMARKS  
Loading Time: Base Classes          0.0166
Doctrine                            0.0486
GetArticle                          1.0441
Functions                           0.0068
Controller Execution Time           1.1770
Total Execution Time                1.1938

Die GetArticle-Funktion macht grundlegend einen EntityManager-> find () Anruf:

$currentart = $this->em->find('Entities\Article', $artid);

Ich muss diese 1 Sekunde warten, auch wenn ich die Methode entityManager-> createEquery () verwende.

Auf jeder Seite habe ich aufgrund der ersten Anfrage von EntityManager einen Zeitverlust von ungefähr 1 Sekunde.

Ist das üblich?

Kommt diese 1 Sekunde aus der Tatsache, dass EntityManager eine Verbindung zum DB herstellen muss? Die Funktionen/Anfragen nach der ersten Anfrage sind jedoch ziemlich schnell.

War es hilfreich?

Lösung

Die zeitaufwändigste Sache, die die Doktrin macht, ist, Metadaten für Ihre Einheiten zu laden, sei es Annotationen, XML oder YAML. Doctrine Lazy lädt die Metadaten nach Möglichkeit, sodass Sie den Auftritt nicht sehen werden, bis Sie Entitäten verwenden. Da sich die Metadaten nicht ändert, wenn Sie Änderungen in Ihrem Code vornehmen, können Sie die Metadaten mit der Doktrin über Anfragen hinweg zwischenspeichern. DQL -Abfragen müssen auch in SQL analysiert werden, sodass die Doktrin eine weitere Caching -Konfiguration dafür bietet.

In einer Produktionsumgebung sollten Sie diese Caches einstellen (es klingt so, als hätten Sie es bereits, aber für andere, die dies lesen):

$cache = new \Doctrine\Common\Cache\ApcCache(); // or MemcacheCache $configuration->setMetadataCachImpl($cache); // caches metadata for entities $configuration->setQueryCachImpl($cache); // caches SQL from DQL queries

Um zu verhindern, dass das Laden der ersten Seite die vollständige Metadatenlast aufnimmt, können Sie einen Cache -Wärmer einrichten, der alle Klassenmetadaten lädt und auf dem Cache speichern.

$em->getMetadataFactory()->getAllMetadata();

Ein weiterer potenzieller Engpass ist die Erzeugung von Proxy -Klassen. Wenn dies in einer Produktionsumgebung nicht korrekt konfiguriert ist, generiert die Doktrin die Klassen und speichert sie auf jeder Seite auf jeder Seite im Dateisystem. Diese Proxy -Klassen ändern sich nicht, es sei denn, der Code des Entität ändert sich, sodass dies erneut unnötig ist. Um die Dinge zu beschleunigen, sollten Sie die Proxys mit dem Befehlszeilen-Tool (ORM: Generate-Proxies) generieren und die automatische Generation deaktivieren:

$configuration->setAutoGenerateProxyClasses(false);

Hoffentlich hilft dir das aus. Einige weitere Informationen finden Sie unter http://www.doctrine-project.org/docs/ORM/2.0/en/reference/improving-performance.html#bytecode-cache

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top