Scheduler - howto

Redjik

Джедай-мастер
Видимо не совсем верно спрашиваю гугль - ничего не смог найти по теме.

Хочу сделать компонент-обертку для планировщика заданий по крону.

Основное назначение - сборщик мусора и рассылка писем.

При обращении к компоненту из бд берутся записи заданий.

id, method_name, params
потом по одному компонент запускает method_name с params, если этот метод существует и отработал удачено - запись удаляется.

Все ли я учел? =)
 

Redjik

Джедай-мастер
Да пишу =)
Ломал голову, решил сделать две таблицы
1) Для повторяющихся - редких заданий, аля сбощик муосра. Раз в 3 дня например, при успехе обновляется поле следующего запуска.
2) Моментальные задания - запускаются сразу, как только вытаскиваются из бд, при успехе - удаляются.

Ну ладно, как запускать методы то хоть? через array_map или $this->{$method_name}
 

ksnk

прохожий
method_exists|is_callable + call_user_func| call_user_func_array

Я бы прикрутил в в таблицу задач еще и имя класса, для пущей гибкости...
 

Ragazzo

TDD interested
Иван Redjik Матвеев
Хм, ksnk все уже сказал )) немного удивлен, что спросил, т.к. в Yii сплошь идет call_user_* и т д, где нужно вызвать что-то кастомное :) кстати если доведешь до ума, выложи как экстеншен на гитхабе или еще где-нибудь.
 

Redjik

Джедай-мастер
Ну я как разгребу, что навалилось, причешу его хорошенько и выложу... наверное на след неделе.
еще до BeforeCount никак руки не дойдут в 100500ый раз закоммитить =)
 

AmdY

Пью пиво
Команда форума
Иван Redjik Матвеев
В шдлере главная проблема - это борьба со временем и таймзонами, но это длинная и неприятная история.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Я кстати написал на днях демона для background tasks на libevent (в текущей реализации для получения задач юзает rabbitMQ, а не базу) но он еще в убер-альфа-грязной версии.
Вариант с кроном все еще плох тем, что запускается только лишь раз в секунду, и плохо скейлится.
 

Redjik

Джедай-мастер
флоппик
ты имел ввиду раз в минуту?
я это дело обошел через
PHP:
run($withDelay = 0)
if ($withDealy){
    sleep($withDelay);
}
Дважды запускаем скрипт первый раз просто, второй с delay
уже получается раз в пол минуты
 

флоппик

promotor fidei
Команда форума
Партнер клуба
флоппик
ты имел ввиду раз в минуту?
Да.
Проблема в том, что он вообще привязан к времени. И немалое количество ресурсов ты будешь тратить на то, что бы раз за разом инстанцировать заново пхп со скриптом.
Я сел писать демона именно потому, что по крону у нас запускалось слишком много, и все очень сильно проседало при запусках.
 

Redjik

Джедай-мастер
флоппик
посмотри на phpClasses был демон (првада на пхп =)))) с вебмордой на замену крону, даже авард получил
 

Redjik

Джедай-мастер
Я его не смотрел, но если у тебя все гладко получилось, то нечем, да =)
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Схема показала себя не очень хорошо по причине php клиента для забора заданий из кролика?
Я вообще разве писал что схема показала себя плохо? :) rabbitmq на себя берет распределение нагрузки, доставки и отметки о выполнении. А в случае долгоиграющих задач база иногда просто отваливалась по wait_timeout. Можно конечно было напихать перепроверок, переподключений к базе... но зачем?
 

alekciy

Новичок
Я вообще разве писал что схема показала себя плохо?
Ну просто фразу "демона для background tasks на libevent " я воспринял недовольство текущей схемы. Когда что-то где-то пишется, то видимо в текущем варианте что-то кого-то не устраивает. Разве нет?
 
Сверху