La memoria per un oggetto (o altro valore) possono essere liberati solo quando non ci sono riferimenti ad essa in qualsiasi parte del processo di PHP. Nel tuo caso, la riga $customer = null
diminuisce di un numero il numero di riferimenti a quell'oggetto, ma non lo raggiunge.
Se si considera un ciclo più semplice, questo può diventare più chiaro:
$test = array('a' => 'hello');
foreach ($test as $key => $value)
{
// $value points at the same memory location as $test['a']
// internally, that "zval" has a "refcount" of 2
$value = null;
// $value now points to a new memory location, but $test['a'] is unnaffected
// the refcount drops to 1, but no memory is freed
}
Poiché si utilizza oggetti, c'è un tocco aggiunto - è possibile modificare l'oggetto all'interno del ciclo senza creare una nuova copia di esso :
$test = array('a' => new __stdClass);
// $test['a'] is an empty object
foreach ($test as $key => $value)
{
// $value points at the same object as $test['a']
// internally, that object has a "refcount" of 2
$value->foo = "Some data that wasn't there before";
// $value is still the same object as $test['a'], but that object now has extra data
// This requires additional memory to store that object
$value = null;
// $value now points to a new memory location, but $test['a'] is unnaffected
// the refcount drops to 1, but no memory is freed
}
// $test['a']->foo now contains the string assigned in the loop, consuming extra memory
nel suo caso, il metodo ->load()
è presumibilmente espandendo la quantità di dati in ciascuno degli organi di $customersCollection
a loro volta, richiedono più memoria per ciascuno. Ispezionare $customersCollection
prima e dopo il ciclo probabilmente lo confermerebbero.
@IMSoP anzi ... –
Questo è un altro [di riferimento] (http://ringsdorff.net/2009/07/23/guest-post-fix-for-memory-leaks-in-magento) che ho trovato. Sembra che il problema risieda in riferimenti circolari. – osondoar
@osondoar Se si utilizza almeno PHP 5.3 (che dovrebbe essere ormai) i riferimenti circolari verranno catturati da un Garbage Collector, sebbene non immediatamente. Tuttavia, vedi la mia risposta sul perché il tuo esempio non libererà anche riferimenti non circolari. – IMSoP