Создание объектов PHP и использование памяти

Основной фиктивный класс:

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

Выходы:

 $ php test.php 353672 353792 353792 353792 

Теперь я знаю, что PHP-документы говорят, что память не будет освобождена до тех пор, пока она не понадобится (попав в потолок). Тем не менее, я написал это как небольшой тест, потому что у меня есть гораздо более длительная задача, используя гораздо больший объект со многими экземплярами этого объекта. И память просто поднимается, в конце концов заканчивается и останавливает исполнение. Даже если эти большие объекты занимают память, так как я уничтожаю их после того, как я закончил с каждым (серийно), он не должен заканчиваться из памяти (если только один объект не исчерпывает все пространство для памяти, что не так ).

Мысли?

У вас есть круглые ссылки, которые могут помешать сборщику мусора выполнять свою задачу?

Я провел быстрый тест, создав 1,000,000 объектов, и память не была съедена:

 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"; с 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"; с 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 <- Очень маленькое увеличение для 1 000 000 объектов, созданных и уничтоженных

Поддержка PHP для объектов и классов не очень эффективна в версии 5.2 (и они не были в прошлом), но предстоящие версии 5.3 и 6.0 – это большой пересмотр в отношении использования классов и объектов, и вы увидите улучшения скорости и памяти в они оба.

В PHP 5.2.x также были написаны некоторые голые кодовые рамки, и было обнаружено, что использование памяти удивительно раздуто. Хотя, учитывая, насколько дешевыми мощными многоядерными процессорами являются и есть RAM, я бы сказал, сохраняя кодирование таким образом, который имеет для вас наибольший смысл и создает более RAD-настройку.

Если вы используете Smarty или Drupal, ваш рабочий проект заканчивается быстрее, а затем используйте их или все, что вы делаете. Не позволяйте сегодняшнему плохому использованию памяти / скорости отключать вас к ООП или фреймворкам, потому что в завтрашней версии есть некоторые примечательные улучшения (реальные тесты показали 30% -ное улучшение скорости по тому же коду).

PS: В вашей настройке что-то не так, я запустил тот же код на Apache / w PHP 5.2.8 в Windows XP и получил: 60872 61080 61080 61080

Вот пересмотренный пример с круговыми ссылками:

 <?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 = array(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"; с <?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 = array(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"; 

Выходы с PHP 5.3.6 (cli):

 644392 644392 644848 1628592