Domanda

Di recente ho integrato Doctrine 2 ORM in CodeIgniter 2. Ho configurato Doctrine 2 come libreria e caricati automaticamente in CodeIgniter. All'interno di una pagina che ho un'istanza di entity manager dottrina nel seguente modo:

private static $em = null;

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

E poi inizio a utilizzare l'Entity Manager quando necessario. Il problema che ho è che in ogni richiesta di pagina Entità Responsabile richiede un certo tempo per inizializzare (appr. 1 secondo). Questo fa sì che l'utente di attendere fino a quando la pagina viene caricata. Qui di seguito potete vedere alcuni risultati di performance ho misurato:

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

La funzione getArticle fa fondamentalmente un EntityManager-> find () chiamata:

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

devo aspettare che 1 secondo, anche se io uso il metodo EntityManager-> createQuery ().

In ogni pagina, ho una perdita di tempo di circa 1 secondo a causa della prima richiesta di EntityManager.

E 'questo comune?

Questo 1 secondo viene dal fatto che EntityManager ha bisogno di stabilire una connessione al DB? Le funzioni / richieste dopo la prima richiesta sono abbastanza veloce però.

È stato utile?

Soluzione

Il più tempo cosa che fa è Dottrina metadati di carico per le entità, che si tratti di annotazioni, XML, o YAML. Dottrina carichi pigri i metadati quando possibile, in modo da non vedere il calo di prestazioni fino a quando si inizia a utilizzare le entità. Dal momento che i metadati non cambia a meno che non si apportano modifiche nel codice, Doctrine consente di memorizzare nella cache i metadati tra le richieste. DQL query anche bisogno di essere analizzato in SQL, quindi Doctrine fornisce un'altra configurazione cache per questo.

In un ambiente di produzione si deve impostare queste cache up (suona come hai già fatto, ma per gli altri la lettura di questo):

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

Al fine di evitare che il primo caricamento della pagina di prendere il pieno carico metadati, è possibile impostare un più caldo cache che carica tutti i metadati di classe e salvarlo nella cache.

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

Un altro potenziale collo di bottiglia è la generazione di classi proxy. Se questo non è configurato correttamente in un ambiente di produzione, Doctrine generare le classi e salvarli nel file system su ogni caricamento della pagina. Queste classi proxy non cambiano a meno modifiche al codice dell'impresa, quindi è ancora una volta inutile perché questo avvenga. Per accelerare le cose, si dovrebbe generare i proxy utilizzando lo strumento da riga di comando (ORM: generate-proxy) e disabilita la generazione automatica:

$configuration->setAutoGenerateProxyClasses(false);

Speriamo che questo ti aiuta. Qualche informazione in più sono disponibili all'indirizzo http://www.doctrine-project.org/docs/orm/2.0/en/reference/improving-performance.html#bytecode-cache

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top