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

AmdY

Пью пиво
Команда форума
WMix
нет, просто хотят поменять виртуальную машину, язык останется тем же.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Да оно как бы понятно из контекста. И аргументы там есть. И ты их знаешь.
PHP не предназначен для написания демонов по той простой причине, что готовых библиотек НЕТ! Тот же forking с обменом данными между процессами написать - пиши своё.
Потоков - нет. Возможны мемлики в стандартных библиотеках. Примитивный garbage collector. Мне продолжать?
В php много для чего нет готовых библиотек. И куда больше для чего они есть. phpDaemon например, это и есть готовая библиотека с обменом данными между процессами, пустых циклов со слипами нет, спасибо либевенту — процессы не просыпаются, пока от ОС сигналов не получат. В чем примитивность GC ? Он давно уже и циклические ссылки умеет, и еще много чего. Я тебе с практики говорю — за 4 месяца запущенный phpDaemon без рестартов отъел аж 16Кбайт лишней памяти. Дочерние процессы рестартовались раз в 100к запросов или 16 часов работы. Не вижу проблемы.
 

cDLEON

Онанист РНРСlub
В 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
Что я делаю не так ?
 

cDLEON

Онанист РНРСlub
Ой, копировал, да не всё скопировал... 5.4.
А когда он должен произойти? Добавил цикл с слипом (первое, что пришло в голову) всё равно ни чего не меняется.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ой, копировал, да не всё скопировал... 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).
 

cDLEON

Онанист РНРСlub
Хе-хе... Они его опциональным сделали...
Понял, спасибо.
ПС. Это получается сам сборщик отжирает 3 метра памяти?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Хе-хе... Они его опциональным сделали...
Нет, я так понимаю, что есть определенный порог, до которого запуск gc банально не выгоден, но можно запускать принудительно, просто посмотреть, что работает.
 

fixxxer

К.О.
Партнер клуба
Не совсем. Если у тебя были ЖИРНЮЩИЕ объекты с взаимными ссылками друг на друга, его очень даже имеет смысл дернуть.

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

Во флэше, например, где нет возможности дернуть gc напрямую, после обработки тяжелой по памяти фигни специально создают и грохают объект из 10к пустых объектов, чтобы триггернуть сборку мусора ;)))
 

флоппик

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