Optimizar exportación de datos con Symfony

symfony.jpg
Solucionex
20
Mayo 16

La exportación de datos, es una de las tareas más recurrente con la que nos encontramos los programadores en nuestro día a día. Estoy seguro que alguna vez habéis tenido que exportar los datos de un tabla de una base de datos en algún formato tipo csv, xls...

En Symfony existen muchos bundles que nos ofrecen solución a este problema, yo utilizo habitualmente ExcelBundle que utiliza la librería PHPExcel.

Un problema típico con el que nos encontramos cuando exportamos datos es el consumo de memoria. Cuando la cantidad de datos es muy grande, si no optimizamos el proceso, es muy fácil que nos quedemos sin memoria o agotemos el tiempo de ejecución del proceso.

En este post veremos como exportar conjunto grande de datos, con bajo consumo de memoria y además generar la descarga sobre la marcha.

La clave está en como obtener los datos y como generar el fichero de descarga con la exportación. En función de como realicemos estas dos operaciones podremos obtener mejores o peores resultados.

Para obtener los datos, debemos evitar el ORM. En Symfony generalmente se utiliza el Doctrine para interactuar con la base de datos, cuando tenemos que explotar gran cantidad de datos debemos usar el DBAL y tratar los datos en formato de arrays.

Para generar el fichero de exportación utilizaremos la clase StreamedResponse del Componente HttpFoundation. Esta solución tiene la ventaja de generar / descargar el archivo poco a poco, de manera que el usuario no tiene que esperar el proceso completo.

A continuación os pongo un ejemplo muy simple de como hacer esta operación:

Espero que os sirva de ayuda :)