Creazione di oggetti PHP e utilizzo della memory

Una class fittizia di base:

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"; 

Uscite:

 $ php test.php 353672 353792 353792 353792 

Ora, so che i documenti PHP dicono che la memory non sarà liberata fino a quando non sarà necessaria (colpendo il soffitto). Tuttavia, ho scritto questo come un piccolo test, perché ho un task molto più lungo, usando un object molto più grande, con molte istanze di quell'object. E la memory si arrampica, alla fine esaurendo e fermando l'esecuzione. Anche se questi oggetti di grandi size occupano memory, poiché li distruggo dopo che ho finito con ciascuno (in serie), non dovrebbe esaurire la memory (a less che un singolo object esaurisca l'integer spazio per la memory, che non è il caso ).

Pensieri?

Avete riferimenti circolari che potrebbero impedire al garbage collector di svolgere il proprio task?

Ho eseguito un test rapido creando 1.000.000 di oggetti e la memory non è stata mangiata:

 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 aumento molto piccolo per 1.000.000 di oggetti creati e distrutti

Il supporto di PHP per oggetti e classi non è molto efficiente nella versione 5.2 (né lo sono stati in passato), ma i prossimi 5.3 e 6.0 sono una grande revisione per quanto riguarda l'uso di classi e oggetti e vednetworking miglioramenti della velocità e della memory in entrambi.

Ho anche scritto alcuni framework bare bone in PHP 5.2.x e ho riscontrato che anche l'uso della memory è sorprendente. Pur considerando quanto siano economiche e potenti le CPU multi-core e ram è, direi di continuare a programmare in un modo che ha più senso per te e crea una configuration più RAD.

Se utilizzi Smarty o Drupal, il tuo progetto di lavoro termina più velocemente, quindi usalo o qualsiasi altra cosa tu faccia. Non lasciare che la scarsa memory / velocità di oggi ti spinga verso OOP o framework perché la versione di domani ha alcuni miglioramenti degni di nota (i benchmark del mondo reale hanno mostrato un miglioramento della velocità del 30% sullo stesso codice).

PS: C'è qualcosa di sbagliato nella tua configuration, ho eseguito lo stesso codice su Apache / w PHP 5.2.8 su Windows XP e ottenuto: 60872 61080 61080 61080

Ecco un esempio rivisto con riferimenti circolari:

 <?php class foo { public $bar = 0; function foo(){} function boo(){} } echo memory_get_usage() . "\n"; $foo = new foo(); unset($foo); echo memory_get_usage() . "\n"; $arr = arrays(new foo()); for ($i = 1; $i < 1000000; $i += 2) { $arr[$i] = new foo(); $arr[$i - 1] = new foo(); unset($arr[$i], $arr[$i - 1]); } echo memory_get_usage() . "\n"; for ($i = 1; $i < 1000000; $i += 2) { $arr[$i] = new foo(); $arr[$i - 1] = new foo(); $arr[$i]->bar = $arr[$i-1]; $arr[$i-1]->bar = $arr[$i]; unset($arr[$i], $arr[$i - 1]); } echo memory_get_usage() . "\n"; 

Output con PHP 5.3.6 (cli):

 644392 644392 644848 1628592