Un mio collega ha scritto una sceneggiatura che stava esaurendo la memoria disponibile. Ho ristretto la scelta a caso seguente prova di base:utilizzo memoria di tipo exessive quando non si deseleziona esplicitamente
for ($i = 0; $i <= 20; $i ++) {
echo memory_get_usage(). '<br />';
$Survey = new Survey(14);
echo memory_get_usage(). '<br /><br />';
}
exit('done');
Questo rompe sulla terza iterazione:
3116696
49123440
49123440
95518368
95518368
[E_ERROR] Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes)
sono riuscito a risolvere il problema, semplicemente aggiungendo un unset()
chiamata nel circuito:
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');
lo script passa attraverso la sua 20 iterazioni piacevole e scorrevole, con un utilizzo della memoria relativamente costante:
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
Questo mi confonde! Il garbage collector non dovrebbe ripulire l'oggetto, poiché la variabile è stata sovrascritta? Sto eseguendo PHP 5.3, quindi i riferimenti circolari non possono essere la causa di questo problema.
@Rjik: sei sicuro che ci siano riferimenti a questi oggetti da qualche altra parte? nessun caching, nessun modello di identità? – RageZ
potrebbe essere sciocco ... ma cosa succede se si disattiva prima di creare un nuovo '$ Sondaggio'? – k102
@RageZ: sì, penso di esserne sicuro. Ci sono comunque riferimenti nell'oggetto. – Rijk