В php много для чего нет готовых библиотек. И куда больше для чего они есть. phpDaemon например, это и есть готовая библиотека с обменом данными между процессами, пустых циклов со слипами нет, спасибо либевенту — процессы не просыпаются, пока от ОС сигналов не получат. В чем примитивность GC ? Он давно уже и циклические ссылки умеет, и еще много чего. Я тебе с практики говорю — за 4 месяца запущенный phpDaemon без рестартов отъел аж 16Кбайт лишней памяти. Дочерние процессы рестартовались раз в 100к запросов или 16 часов работы. Не вижу проблемы.Да оно как бы понятно из контекста. И аргументы там есть. И ты их знаешь.
PHP не предназначен для написания демонов по той простой причине, что готовых библиотек НЕТ! Тот же forking с обменом данными между процессами написать - пиши своё.
Потоков - нет. Возможны мемлики в стандартных библиотеках. Примитивный garbage collector. Мне продолжать?
Да, я смотрел его код. Знаю что это. Не плохо код написан, кстати, да.В php много для чего нет готовых библиотек. И куда больше для чего они есть. phpDaemon например, это и есть готовая библиотека с обменом данными между процессами, пустых циклов со слипами нет, спасибо либевенту — процессы не просыпаются, пока от ОС сигналов не получат. В чем примитивность GC ? Он давно уже и циклические ссылки умеет, и еще много чего. Я тебе с практики говорю — за 4 месяца запущенный phpDaemon без рестартов отъел аж 16Кбайт лишней памяти. Дочерние процессы рестартовались раз в 100к запросов или 16 часов работы. Не вижу проблемы.
echo "<?php function func() {$obj = new stdclass(); $obj->str = str_repeat('bla', 10240); func2($obj);}; function func2 ($a) {$obj = new stdclass(); $obj->link = $a; $a->link=$obj; }; $mem = memory_get_usage(); func(); var_dump(memory_get_usage()-$mem);?>" | php
"int(31360)"
Допускаешь, что garbage collection должен произойти одновременно с твоим вызовом get_memory_usage() ?Что я делаю не так ?
Ой, копировал, да не всё скопировал... 5.4.
А когда он должен произойти? Добавил цикл с слипом (первое, что пришло в голову) всё равно ни чего не меняется.
<?php
function func()
{
$obj = new stdclass();
$obj->str = str_repeat('bla', 1024);
func2($obj);
}
function func2($a)
{
$obj = new stdclass();
$obj->link = $a;
$a->link = $obj;
}
$mem = memory_get_usage(true);
echo '<pre>';
echo 'PHP_VERSION: '.PHP_VERSION . PHP_EOL;
echo 'GC_ENABLED: '.(gc_enabled()?'true':'false'). PHP_EOL;
for($i = 0; $i<1000000; $i++)
{
func();
if ($i%5000==0)
{
echo 'iteration: '.$i.'; gc_cycles: '.gc_collect_cycles().'; memory: '. ceil((memory_get_usage(true) - $mem) / 1024) . 'k' . PHP_EOL;
}
}
Если сборщик мусора включен, алгоритм поиска циклических ссылок выполняется каждый раз, когда корневой буфер наполняется 10,000 корнями (вы можете поменять это значение, изменив константу GC_ROOT_BUFFER_MAX_ENTRIES в файле Zend/zend_gc.c в исходном коде PHP и пересобрав PHP).
Нет, я так понимаю, что есть определенный порог, до которого запуск gc банально не выгоден, но можно запускать принудительно, просто посмотреть, что работает.Хе-хе... Они его опциональным сделали...
))А фиг его знает. Там можно собрать с дебагом сборщика PHP, но это возится надоПС. Это получается сам сборщик отжирает 3 метра памяти?
Там что угодно может быть, начиная от LazyWrite сработавшего, и т.п. Но факт, как размер устаканился, до конца скрипта он больше не менялся.