Question

Récemment, j'intégrée Doctrine 2 ORM dans CodeIgniter 2. Je Doctrine 2 comme configuré une bibliothèque et autochargée dans CodeIgniter. Au sein d'une page I gestionnaire d'entités de doctrine instancier de la manière suivante:

private static $em = null;

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

Et puis je commence à utiliser le Gestionnaire d'entité en cas de besoin. La question que j'ai est que chaque demande de page Entity Manager prend un certain temps pour initialiser (appr. 1 seconde). Cela provoque l'utilisateur d'attendre jusqu'à ce que la page est chargée. Ci-dessous vous pouvez voir des résultats de performance I mesuré:

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 fonction getArticle fait un appel basiquement EntityManager-> find ():

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

j'attendre que 1 seconde, même si j'utilise la méthode EntityManager-> CreateQuery ().

Dans chaque page, j'ai une perte de temps d'environ 1 seconde à cause de la première demande de EntityManager.

Est-ce courant?

Est-ce que 1 seconde vient du fait que EntityManager a besoin d'établir une connexion à la DB? Les fonctions / demandes après la première demande sont assez vite cependant.

Était-ce utile?

La solution

La plupart du temps chose qui est la doctrine ne métadonnées de charge pour vos entités, que ce soit des annotations, XML ou YAML. Doctrine charge paresseuses les métadonnées lorsque cela est possible, de sorte que vous ne verrez pas le succès de la performance jusqu'à ce que vous commencez à utiliser des entités. Étant donné que les métadonnées ne change pas, sauf si vous apportez des modifications dans votre code, Doctrine vous permet de mettre en cache les métadonnées entre les requêtes. DQL requêtes doivent également être analysées en SQL, si Doctrine fournit une autre configuration de la mise en cache pour cela.

Dans un environnement de production, vous devriez mettre ces caches vers le haut (il semble que vous avez déjà, mais pour d'autres la lecture de ce):

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

Afin d'éviter la première chargement de la page de prendre la pleine charge de métadonnées, vous pouvez configurer un cache plus chaud qui se charge toutes les métadonnées de classe et de l'enregistrer dans le cache.

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

Un autre goulot d'étranglement potentiel est la génération des classes proxy. Si ce n'est pas configuré correctement dans un environnement de production, la doctrine va générer les classes et les enregistrer dans le système de fichiers sur chaque chargement de page. Ces classes proxy ne changent pas, sauf si les modifications du code de l'entité, il est donc encore nécessaire pour que cela se produise. Pour accélérer les choses, vous devez générer les procurations en utilisant l'outil de ligne de commande (ORM: generate-proxy) et désactiver la génération automatique:

$configuration->setAutoGenerateProxyClasses(false);

Espérons que cela vous aide. Quelques informations supplémentaires sont disponibles sur http://www.doctrine-project.org/docs/orm/2.0/en/reference/improving-performance.html#bytecode-cache

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top