Mi aplicación PHP tiene un script de importación que puede importar registros.Cómo solucionar una fuga de memoria en PHP
Por el momento, que es la importación de un archivo CSV. Está leyendo cada línea del archivo CSV, una línea a la vez usando fgetcsv, y para cada línea está haciendo mucho de procesamiento en ese registro, incluidas las consultas de la base de datos, y luego pasa a la siguiente línea. No debería necesitar seguir acumulando más memoria.
Después de importar unos 2500 registros, PHP muere, diciendo que ha sobrepasado su límite de memoria (132 MB o menos).
El archivo CSV en sí mismo es solo un par de megas; el otro procesamiento que ocurre hace muchas comparaciones de cadenas, diffs, etc. Tengo una gran cantidad de código operando en él y sería difícil llegar a una 'muestra reproductora más pequeña'.
¿Cuáles son algunas buenas formas de encontrar y solucionar un problema de este tipo?
Causa del problema encontrado
que tienen una clase de depuración que registra todas mis consultas de bases de datos en tiempo de ejecución. Entonces esas cadenas de SQL, de unos 30KB de largo, permanecían en la memoria. Me doy cuenta de que esto no es adecuado para scripts diseñados para ejecutarse durante mucho tiempo.
Puede haber otras fuentes de pérdidas de memoria, pero estoy bastante seguro de que esta es la causa de mi problema.
+1 Trabajo mucho con archivos CSV en PHP y con el tiempo me encontraré con este problema. – alex
Tuve un problema similar en CodeIgniter al procesar un gran archivo de registro e insertarlo en un DB. Cambié las inserciones para usar CodeIgniters 'simple_query' en lugar del método usual' query' y reduje el uso de la memoria por un factor de 10. – MattSmith