2011-10-08 9 views
7

Estaba teniendo un problema de pérdida de memoria en un script de Doctrine2 aparentemente causado por un código que se suponía eliminaría los problemas de memoria.Cómo cerrar correctamente un Entity Manager en la doctrina

Antes de saber que podría (y debería) borrar el gestor de entidades, cada 20 iteraciones hice lo siguiente:

if ($this->usersCalculated % 20 == 0) { 
    $this->em->close(); 
    $this->em = \Bootstrap::createEm(); 
    $this->loadRepositories(); 
} 

Y el Bootstrap :: createEm se ve así:

public static function createEm() { 
    $em = EntityManager::create(Bootstrap::$connectionOptions, Bootstrap::$config); 
    $em->getConnection()->setCharset('utf8'); 
    return $em; 
} 

La razón por la que recreé el administrador de la entidad fue porque mi UnitOfWork se estaba volviendo loco y no sabía sobre el método $ em-> clear().

Entonces, incluso si mi pérdida de memoria actual parece resuelta actualmente (o al menos reducida), aún tengo que crear un nuevo Entity Manager cada vez que necesito hacer una consulta de inserción/actualización por separado sin confiar en que otra persona el color. Por ejemplo, cada vez que envíe un correo electrónico, insertar una fila en la base de datos para indicar así, y el código tiene este aspecto:

$emailSent = new \model\EmailSent(); 
    $emailSent->setStuff(); 
    // I do it in a new em to not affect whatever currentunit was doing. 
    $newEm = \Bootstrap::createEm(); 
    $newEm->persist($emailSent); 
    $newEm->flush(); 
    $newEm->close(); 

Por lo que he aprendido de antes, que deja algo de memoria perdida atrás.

Entonces mi pregunta es, ¿qué estoy haciendo mal aquí? ¿Por qué esta memoria está goteando y cómo debería cerrar/recrear realmente un administrador de entidades?

Respuesta

2

¿Has probado realmente usar el método claro en lugar de cerrar?

espero que esto le ayuda --->Batch Processing

+0

@Cristian_Douce Como dije en la pregunta, mi problema de pérdida de memoria se resolvió después de usar el claro en lugar de volver a crear. Pero la pregunta sigue siendo válida porque tengo otras partes de las secuencias de comandos que necesitan la creación y destrucción de la em. –

+0

¿Y qué hay de borrar antes de cerrarlo? –

+0

@ Christian_Douce Lo estoy limpiando antes de cerrarlo. Y he leído el código de doctrinas para la función de cierre, todo lo que hace es llamar a clear y marcarlo como cerrado. Debe haber algún attribue estático o un objeto persistente que contenga una referencia al em, si no el recolector de basura lo hubiera liberado. –

9

Ha intentado:

$this->em->getConnection()->getConfiguration()->setSQLLogger(null); 

He leído que este se apague el registrador de SQL que no se borra y en ocasiones produce pérdidas de memoria como estás experimentando

+1

¡Esa es la única! – Burgi

Cuestiones relacionadas