Un colega mío escribió un script que estaba agotando la memoria disponible. I reducido a la siguiente caso de prueba básica:uso de la memoria del objeto existente cuando no se deshace explícitamente
for ($i = 0; $i <= 20; $i ++) {
echo memory_get_usage(). '<br />';
$Survey = new Survey(14);
echo memory_get_usage(). '<br /><br />';
}
exit('done');
Esto rompe en la tercera iteración:
3116696
49123440
49123440
95518368
95518368
[E_ERROR] Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes)
me las arreglé para solucionar este problema, simplemente añadiendo una llamada unset()
en el bucle:
for ($i = 0; $i <= 20; $i ++) {
echo memory_get_usage(). '<br />';
$Survey = new Survey(14);
unset($Survey);
echo memory_get_usage(). '<br /><br />';
}
exit('done');
Ahora el guión pasa a través de sus 20 iteraciones agradable y suave, con un uso de memoria relativamente constante:
3116816
49123488
49123488
50691656
50691656
51088912
51088912
51079064
51079064
50535368
50535368
50809296
50809296
51033392
51033392
51157208
51157208
50543856
50543856
50892760
50892760
51045160
51045160
51132688
51132688
50535968
50535968
50968632
50968632
51058080
51058080
51143304
51143304
50562136
50562136
51067432
51067432
51067768
51067768
51170824
51170824
50551712
done
Esto me confunde! ¿No se supone que el recolector de basura limpia el objeto, ya que su variable ha sido sobrescrita? Estoy ejecutando PHP 5.3, por lo que las referencias circulares no pueden ser la causa de este problema.
@Rjik: ¿estás seguro de que hay alguna referencia a esos objetos en otro lugar? sin almacenamiento en caché, sin patrón de identidad? – RageZ
puede ser una tontería ... pero, ¿qué pasa si 'desconectaste' antes de crear una nueva '$ Survey'? – k102
@RageZ: sí, creo que estoy seguro. Sin embargo, hay referencias en el objeto ... – Rijk