Pregunta

Recientemente integré la doctrina 2 ORM en Codeigniter 2. Configuré la doctrina 2 como una biblioteca y la envié automáticamente en CodeIgniter. Dentro de una página, instituyo al administrador de entidades de doctrina de la siguiente manera:

private static $em = null;

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

Y luego empiezo a usar el administrador de entidades cuando sea necesario. El problema que tengo es que en cada página de Entity Manager tarda un tiempo en inicializarse (aprobado 1 segundo). Esto hace que el usuario espere hasta que se cargue la página. A continuación puede ver algunos resultados de rendimiento que medí:

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 función getAtticle básicamente hace que entityManager-> find () llame:

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

Tengo que esperar ese 1 segundo incluso si uso el método EntityManager-> CreateQuery ().

En cada página, tengo una pérdida de tiempo de aproximadamente 1 segundo debido a la primera solicitud de EntityManager.

¿Es esto común?

¿Este 1 segundo proviene del hecho de que EntityManager necesita establecer una conexión con el DB? Sin embargo, las funciones/solicitudes después de la primera solicitud son bastante rápidas.

¿Fue útil?

Solución

Lo que hace más tiempo que hace Doctrine es cargar metadatos para sus entidades, ya sean anotaciones, XML o YAML. Doctrine Lazy Cargue los metadatos cuando sea posible, por lo que no verá el éxito de rendimiento hasta que comience a usar entidades. Dado que los metadatos no cambian a menos que realice cambios en su código, Doctrine le permite almacenar en caché los metadatos en las solicitudes. Las consultas DQL también deben analizarse en SQL, por lo que Doctrine proporciona otra configuración de almacenamiento en caché para esto.

En un entorno de producción, debe configurar estos cachés (parece que ya lo ha hecho, pero para otros leyendo esto):

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

Para evitar que la carga de la primera página tome la carga completa de metadatos, puede configurar un calentador de caché que cargue todos los metadatos de clase y guardarla en el caché.

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

Otro posible cuello de botella es la generación de clases proxy. Si esto no está configurado correctamente en un entorno de producción, Doctrine generará las clases y las guardará en el sistema de archivos en cada carga de página. Estas clases de poder no cambian a menos que el código de la entidad cambie, por lo que nuevamente es innecesario que esto suceda. Para acelerar las cosas, debe generar los proxies utilizando la herramienta de línea de comandos (ORM: generar proxis) y deshabilitar la generación automática:

$configuration->setAutoGenerateProxyClasses(false);

Espero que esto te ayude. Se puede encontrar más información en http://www.doctrine-project.org/docs/orm/2.0/en/reference/improving-performance.html#bytecode-cache

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top