liberate php memory-leaks unset

liberate memory php



¿Cuál es el mejor método para la limpieza de memoria en PHP?(5.2) (5)

PHP mismo confunde ambos conceptos a veces, pero, en general, una variable establecida en NULL no es lo mismo que una variable que no existe:

<?php $foo = ''One''; $bar = ''Two''; $foo = NULL; unset($bar); var_dump($foo); // NULL var_dump($bar); // Notice: Undefined variable: bar var_dump(get_defined_vars()); // Only foo shows up: ["foo"]=> NULL ?>

Tengo dos preguntas simples. ¿Qué es mejor / útil para la limpieza de la memoria?

$var = null;

o

unset($var);

Tengo una función con un ciclo. Me estoy poniendo (después de unos minutos)

Fatal error: Allowed memory size of 419430400 bytes exhausted

Estoy estableciendo null y unset () - ing cada objeto (al final del ciclo) pero aún sin éxito :( No puedo averiguar qué está consumiendo la memoria.

¿Y qué hay de las llamadas a funciones en ciclo? ¿Liberará PHP todas las asignaciones en estas funciones? (Después de la llamada)


Si desarma la variable que acaba de marcar, en la próxima recolección de basura se eliminará. Si se establece en nulo, los datos de la variable se sobrescribirán.

Tal vez vea también los comentarios en el manual php: Unset Manual

Al menos este comportamiento es también lo que he encontrado hasta ahora. Pero para solucionarlo, primero debe intentar averiguar qué está causando que la memoria crezca. La función memory_get_usage debería ser útil para esto.


unset () hace exactamente eso, desarma una variable; pero no libera memoria inmediatamente.

El recolector de basura de PHP realmente liberará la memoria utilizada previamente por las variables que ahora están desarmadas, pero solo cuando se ejecuta. Esto podría ser más pronto, cuando los ciclos de la CPU no se utilizan activamente para otro trabajo, o antes de que el script se quedara sin memoria ... lo que ocurra primero.

Y tenga en cuenta que unset no liberará necesariamente la memoria utilizada por una variable si tiene otras referencias a esa variable. Simplemente eliminará la referencia y reducirá el recuento de referencia de los datos almacenados reales en 1.

EDITAR Mientras que unset no libera inmediatamente la memoria utilizada (solo la recolección de basura realmente lo hace), la memoria que ya no se utiliza como resultado está disponible para la declaración de nuevas variables


And what about function calls in cycle? Will PHP release all allocations in these functions?(after call)

Una vez que la ejecución abandona el alcance de una función, todas las variables no estáticas se eliminan de la memoria.


Encontré un problema

Primero fue causado por las herramientas de generación de xdebug (he activado todo :)) y consume mucha memoria.

Así que recuerde: xdebug (cuando se activa el procesamiento) consume algo de memoria en el proceso PHP de su aplicación

En segundo lugar, no lancé miembros estáticos utilizados en las funciones llamadas.