Фоновые задачи на php

  • Автор темы Автор темы Ragazzo
  • Дата начала Дата начала
WMix
нет, просто хотят поменять виртуальную машину, язык останется тем же.
 
Да оно как бы понятно из контекста. И аргументы там есть. И ты их знаешь.
PHP не предназначен для написания демонов по той простой причине, что готовых библиотек НЕТ! Тот же forking с обменом данными между процессами написать - пиши своё.
Потоков - нет. Возможны мемлики в стандартных библиотеках. Примитивный garbage collector. Мне продолжать?
В php много для чего нет готовых библиотек. И куда больше для чего они есть. phpDaemon например, это и есть готовая библиотека с обменом данными между процессами, пустых циклов со слипами нет, спасибо либевенту — процессы не просыпаются, пока от ОС сигналов не получат. В чем примитивность GC ? Он давно уже и циклические ссылки умеет, и еще много чего. Я тебе с практики говорю — за 4 месяца запущенный phpDaemon без рестартов отъел аж 16Кбайт лишней памяти. Дочерние процессы рестартовались раз в 100к запросов или 16 часов работы. Не вижу проблемы.
 
В php много для чего нет готовых библиотек. И куда больше для чего они есть. phpDaemon например, это и есть готовая библиотека с обменом данными между процессами, пустых циклов со слипами нет, спасибо либевенту — процессы не просыпаются, пока от ОС сигналов не получат. В чем примитивность GC ? Он давно уже и циклические ссылки умеет, и еще много чего. Я тебе с практики говорю — за 4 месяца запущенный phpDaemon без рестартов отъел аж 16Кбайт лишней памяти. Дочерние процессы рестартовались раз в 100к запросов или 16 часов работы. Не вижу проблемы.
Да, я смотрел его код. Знаю что это. Не плохо код написан, кстати, да.
PHP:
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)"
php -v
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
with Xdebug v2.2.0rc1, Copyright (c) 2002-2012, by Derick Rethans
Что я делаю не так ?
 
Ой, копировал, да не всё скопировал... 5.4.
А когда он должен произойти? Добавил цикл с слипом (первое, что пришло в голову) всё равно ни чего не меняется.
 
Ой, копировал, да не всё скопировал... 5.4.
А когда он должен произойти? Добавил цикл с слипом (первое, что пришло в голову) всё равно ни чего не меняется.

screenshot.1.png

PHP:
<?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;
    }
}

http://www.php.net/manual/ru/features.gc.collecting-cycles.php
Если сборщик мусора включен, алгоритм поиска циклических ссылок выполняется каждый раз, когда корневой буфер наполняется 10,000 корнями (вы можете поменять это значение, изменив константу GC_ROOT_BUFFER_MAX_ENTRIES в файле Zend/zend_gc.c в исходном коде PHP и пересобрав PHP).
 
Хе-хе... Они его опциональным сделали...
Понял, спасибо.
ПС. Это получается сам сборщик отжирает 3 метра памяти?
 
Хе-хе... Они его опциональным сделали...
Нет, я так понимаю, что есть определенный порог, до которого запуск gc банально не выгоден, но можно запускать принудительно, просто посмотреть, что работает.
 
Не совсем. Если у тебя были ЖИРНЮЩИЕ объекты с взаимными ссылками друг на друга, его очень даже имеет смысл дернуть.

Число корней - это классическое для gc эмпирическое решение из разряда "как бы это сделать, чтобы проверка условия была O(1) и достаточно пригодной на практике в общем случае".

Во флэше, например, где нет возможности дернуть gc напрямую, после обработки тяжелой по памяти фигни специально создают и грохают объект из 10к пустых объектов, чтобы триггернуть сборку мусора ;)))
 
ПС. Это получается сам сборщик отжирает 3 метра памяти?
А фиг его знает. Там можно собрать с дебагом сборщика PHP, но это возится надо :) Там что угодно может быть, начиная от LazyWrite сработавшего, и т.п. Но факт, как размер устаканился, до конца скрипта он больше не менялся.
 
Сверху