Creación de objetos PHP y uso de memoria

Una clase ficticia básica:

class foo { var $bar = 0; function foo() {} function boo() {} } echo memory_get_usage(); echo "\n"; $foo = new foo(); echo memory_get_usage(); echo "\n"; unset($foo); echo memory_get_usage(); echo "\n"; $foo = null; echo memory_get_usage(); echo "\n"; 

Productos:

 $ php test.php 353672 353792 353792 353792 

Ahora, sé que los doctores de PHP dicen que la memoria no se liberará hasta que sea necesaria (llegando al techo). Sin embargo, escribí esto como una pequeña prueba, porque tengo una tarea mucho más larga, el uso de un objeto mucho más grande, con muchas instancias de ese objeto. Y la memoria simplemente asciende, finalmente se acaba y detiene la ejecución. Aunque estos objetos grandes ocupan memoria, dado que los destruyo después de terminar cada uno (en serie), no debería quedarse sin memoria (a menos que un solo objeto agote todo el espacio para la memoria, que no es el caso). )

¿Pensamientos?

¿Tiene referencias circulares que podrían evitar que el recolector de basura realice su tarea?

Ejecuté una prueba rápida creando 1,000,000 de objetos y la memoria no se consumió:

 class foo { var $bar = 0; function foo() {} function boo() {} } echo memory_get_usage() . "\n"; $foo = new foo(); unset($foo); echo memory_get_usage() . "\n"; for ($i = 0; $i < 1000000; $i++) { $var = 'foo' . $i; // Use a different variable name each time $$var = new foo(); unset($$var); } echo memory_get_usage() . "\n"; 

65080 65384 65568 <- Un incremento muy pequeño para 1,000,000 de objetos creados y destruidos

El soporte de PHP para objetos y clases no es muy eficiente en la versión 5.2 (ni lo han sido en el pasado), pero los próximos 5.3 y 6.0 son una gran revisión en cuanto al uso de clases y objetos, y verás mejoras de velocidad y memoria en los dos.

También he escrito algunos frameworks de hueso desnudo en PHP 5.2.x y encontré que el uso de la memoria también es sorprendente. Aunque teniendo en cuenta cuán baratas son las potentes CPU multinúcleo y RAM, diría que sigan codificando de la manera más adecuada para ustedes y creen una configuración más RAD.

Si usa Smarty o Drupal hace que su proyecto de trabajo finalice más rápido, entonces úselos, o cualquier cosa personalizada que haga. No permita que el uso deficiente de memoria / velocidad lo desvíe a OOP o frameworks porque la versión de mañana tiene algunas mejoras notables (los puntos de referencia del mundo real han mostrado una mejora del 30% de velocidad en el mismo código).

PD: Hay algo mal con su configuración, ejecuté el mismo código en Apache / w PHP 5.2.8 en Windows XP y obtuve: 60872 61080 61080 61080

Aquí hay un ejemplo revisado con referencias circulares:

 bar = $arr[$i-1]; $arr[$i-1]->bar = $arr[$i]; unset($arr[$i], $arr[$i - 1]); } echo memory_get_usage() . "\n"; 

Salidas con PHP 5.3.6 (cli):

 644392 644392 644848 1628592