Основной фиктивный класс:
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