Me he encontrado con esto, y hay un par de técnicas que encontré realmente ayudaron con el uso extensivo de memoria de Doctrine.
1: Donde sea posible, hidrate los resultados de su consulta de Doctrine en una matriz. Puede hacerlo de la siguiente ejemplo:
$query = self::createQuery("q")->
...
->setHydrationMode(Doctrine::HYDRATE_ARRAY)
->execute();
Esta Doctrina fuerzas para no crear objetos de gran tamaño, pero en cambio se reduce a una matriz. Obviamente, tenga en cuenta que si hace esto, perderá la capacidad de llamar a métodos, etc., así que esto solo es bueno si lo está usando para leer valores de campo, etc.
2: Libere los resultados después de la ejecución. Esto está documentado en una pequeña área de la documentación de la doctrina, pero en realidad ayudó a cabo la tarea de importación que estaba usando:
$query->free();
Eso es todo. También puede hacer esto en los objetos que ha creado, por ejemplo, $myObj->free();
y esto fuerza a Doctrine a eliminar todas las referencias circulares que crea. Tenga en cuenta que las referencias circulares se liberan automáticamente desde PHP 5.3 en adelante al eliminar un objeto mediante el alcance de PHP o unset()
, pero antes deberá hacerlo usted mismo.
Desarmar variables después de que las haya usado también ayuda, aunque haga esto en conjunto con el método anterior free()
como se mencionó, como unset()
no borrará las referencias circulares de lo contrario.
+1 buena pregunta; ¡es algo que realmente no está cubierto en los documentos de Symfony! – richsage
Otra respuesta para evitar la pérdida de memoria http://stackoverflow.com/a/4066680/569101 – j0k