Как правильнее организовать работу выполнения Заданий?

Dzen

Новичок
День добрый,

Крон дёргает пхп файл 1 раз в минуту.
Пхп файл обращается к базе MySQL и берёт из таблицы нужные параметры для выполнения у 1-го Задания. Выполняет его. Делаем пометку, что Задание выполнено, чтобы второй раз его не выполнять в этом цикле.
Через 1 минуту Кроном опять дёргается тот же пхп файл и берутся параметры у 2-го задания и выполняются и т.д. Т.е. идёт очередь.
После выполнения последнего задания, идёт снова выполнение первого задания, либо ждём 5 минут если всё уже выполнено (если заданий мало - 2 например), и снова начинаем цикл.

Если в таблице 120 заданий, и Крон дёргает скрипт, который обращается к базе 1 раз в минуту, получается каждое задание выполняется 1 раз в 2 часа (это слишком долго ждать).

Как это правильно реализовать? Чтобы и быстро и сервер/хостинг не лёг?
Может есть готовые такие таскеры?
 

do2005

Новичок
А какая задача-то? Побыстрому сделать все задания, и при этом не положить сервер?
Если да, то можно использовать sleep(число секунд сна) между выполнениями заданий и пытаться сделать все задания подряд.
Чтобы скрипт работал пока не доработает и не прерывался по таймауту можно использовать set_time_limit(0);
 
  • Like
Реакции: Dzen

Dzen

Новичок
do2005, ну да, идеальная задача - выполнять все 120 заданий раз в 5 минут, но это видимо не реально, ну или хотя бы как-то с минимальным интервалом. А sleep сильно повлияет на нагрузку? Т.е. сделает её более равномерной, видимо такое решение?
Хотя время работы скрипта тогда будет 10 минут, если 120 заданий и слип 5 сек. сделать. Насколько это любят хостеры вот :-\
 

do2005

Новичок
Видимо экспериментально надо устанавливать соответствие кол-ва заданий за период времени и загрузки CPU. Смотреть чтобы не выскочило за лимиты.
Sleep просто приостанавливает на заданное время выполнение скрипта. Да, так нагрузку можно сделать более размазанной.
 
  • Like
Реакции: Dzen

AmdY

Пью пиво
Команда форума
При старте задачи создашь временный файл с таймстампом старта. Соотвественно, проверяешь если такой файл есть и время не сильно устарело, стартуешь задачи. (время нужно чтобы упавшие задачи резолвить). В скрипте после выполнени задачи, стартуешь новую, если она есть, обновляя при этом время в pid файле.

Крон раз в минуту стартует этот скрипт, фактически выполняя задачу супервизора и больше следит, чтобы скрипт не падал.
 

Dzen

Новичок
AmdY, и в базе после каждого задания, делать пометку, что оно выполнено, так вроде да? Чтобы по новому старту их не делать, когда скрипт рухнул.

вообще, я смотрел какой-то фреймворк, и там подобные вещи реализовывались через вроде class Cron_Threaded и т.д., какие-то процессы, многопоточности якобы создавались.


Соотвественно, проверяешь если такой файл есть и время не сильно устарело, стартуешь задачи.
наоборот наверно? если время _устарело_, тогда стартуем, а если разница с текущим 10 секунд, то значит скрипт еще работает.
 

scorpion-ds

Новичок
Пробуй выполнять за раз несколько задач, если как писал выше AmdY, видишь что со старта выполнения задач прошло приемлемое время, то начинаешь новую задачу, к примеру поставь, что скрипт может работать 15 сек., вот что успеется сделать за это время, то и отмечай выполненным.
 

Dzen

Новичок
поставь, что скрипт может работать 15 сек
а зачем его ограничивать вообще? он же если рухнет, то в БД будет запись о последнем удачном Задании, со следующего после него и начнётся вторичный запуск, такая вроде логика, или для чего время тогда в 15 сек?
 

scorpion-ds

Новичок
Ну тогда почему бы не выполнять все 120 заданий за один раз?

Если сервер рухнет по любой причине, то это уже проблема, нельзя полагаться на то, что запишет он что-то или нет.
 

полудух

Итсист
наоборот наверно? если время _устарело_, тогда стартуем, а если разница с текущим 10 секунд, то значит скрипт еще работает.
.pid-файл себе заведи

когда скрипт рухнул
лол
сделай так, чтобы не рухал, что за детский сад. Ставь отметки по времени успешного окончания каждого задания, оптимизируй задания.
организуйся уже!

зы: а вообще, зачем тут поощряют телепатию?
 
Сверху