Con respecto a los objetos, especialmente en el escenario de carga lenta, uno debe considerar que el recolector de basura se está ejecutando en ciclos inactivos de la CPU, por lo que suponiendo que tenga problemas cuando muchos objetos se cargan, la penalización de poco tiempo resolverá la liberación de memoria.
Use time_nanosleep para permitir que GC recopile memoria. Establecer variable en nulo es deseable.
Probado en el servidor de producción, originalmente el trabajo consumía 50 MB y luego se detuvo. Después de que se usó nanosleep 14MB fue un consumo constante de memoria.
Uno debería decir que esto depende del comportamiento del GC que puede cambiar de una versión de PHP a otra. Pero funciona en PHP 5.3 bien.
p.ej. esta muestra (código tomado del feed de Google VirtueMart2)
for($n=0; $n<count($ids); $n++)
{
//unset($product); //usefull for arrays
$product = null
if( $n % 50 == 0 )
{
// let GC do the memory job
//echo "<mem>" . memory_get_usage() . "</mem>";//$ids[$n];
time_nanosleep(0, 10000000);
}
$product = $productModel->getProductSingle((int)$ids[$n],true, true, true);
...
$whatever
apunta a un objeto,$whatever = null
sobrescribe el puntero, no el objeto en sí mismo, por lo que actúa básicamente igual queunset()
.