Cómo se hace para que una función recursiva no de un memory exhausted en Php? De momento sólo he probado a setear todas las variables a null al empezar y les hago un unset al terminar, pero no parece funcionar.
He trackeado la memoria usada en cada iteración con memory_get_usage
y memory_get_peak_usage
y efectivamente en cada ejecución se va llevando unos 10mb, hasta que llega a los 128 que tengo puesto y casca (obv). No quiero aplicar la solución de aumentar la memoria del script porque tarde o temprano me va a dar el mismo fallo.
#36786 pregunto, para que es la recursividad? 128MB en recursividad me parece una burrada.
#36787 me traigo unos datos de la bd, los proceso, y los exporto a excel. Unos 10mb aprox se lleva cada ejecución. Es un cron que ejecuta un proceso que lanza todos los que haya pendientes.
Hay forma de vaciar la memoria o no se puede hacer así?
Edit: pregunta 2: no debería funcionar lo que he intentado de setear a null al empezar y unset al terminar? Otra cosa es que deba hacer lo mismo para las variables de otros modelos que se utilizan, eso no lo he contemplado y puede que funcione. Porque ahora que lo pienso, la variable interna que se genera al exportar un excel suele ser bastante tocha, es más que probable que sea esa la que me está jodiendo.
#36788 unset no libera la memoria, borra la variable (la mete en la cola de la basura realmente) y hasta que el compilador no limpia la basura no se libera la memoria, si hay recursividad la memoria no se va a liberar hasta que se resuelva la recursividad.
Si son muchos datos lo que deberías de hacer es establecer un límite, si por cada iteración manejas muchos datos debes de pararla antes, yo lo que haría sería procesar X datos y resolver la recursividad, así hasta que acabe el trabajo.
#36793 ¿Te obligan a hacerlo con recursividad? Si no, hay mejores maneras si no hay dependencias en las operaciones que estás haciendo.
#36794 obligar es una palabra muy dura, no debería usarse en entornos laborales.
Quiero que una función se ejecute cuando es terminada hasta que se cumpla una condición. Si se puede hacer de otra forma que no sea recursividad, te escucho.
#36795 cualquier algoritmo recursivo se puede escribir iterativamente. No entiendo lo de “otra forma que no sea recursividad”
#36797 a ver, claro. Puedo poner un while en la función y que termine cuando se cumpla la condición, pero eso me va a dar el memory exhausted igual. Me refería a este caso en particular.
#36799 es eso, no tiene más ni me he dejado nada a medias. Tengo una lista de cosas por exportar, y hasta que no las exporto todas no termino
foo
¿he terminado?
SI
--- fin
NO
--- proceso y exporto
--- foo
No hay streams? el memory sera por tener todo en memoria: los datos de la bd y el fichero excel abierto con los cambios en memoria. Si puedes leer modo Stream (de x en x) y escribir haciendo appends (csv, tsv, o lo que sea) casi mejor.
Los excel, con segun que libs son una mierda, tienen todo en memoria hasta que guardas), mira a ver si puedes ir flusheando/guardando cambios o algo para ir liberando. O cambia de lib
Seguramente ahi tengas el problema
#36807 no he podido, ayer tuvimos subida a producción y, literalmente, el servidor explotó. Tuvimos jarana xD