Создание объектов PHP и использование памяти - PullRequest
2 голосов
/ 22 января 2009

Базовый класс манекена:

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

Мысли

Ответы [ 3 ]

2 голосов
/ 22 января 2009

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

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

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

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

2 голосов
/ 24 апреля 2011

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

<?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
2 голосов
/ 22 января 2009

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

Я провел быстрый тест, создав 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";

65080 65384 65568 <- очень небольшое увеличение на 1 000 000 созданных и уничтоженных объектов </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...