Задать вопрос
@bx-coder

Как выполнить операцию в заданное точное время?

Суть вот в чем. Есть таблица в БД с расписанием неких действий. Время в расписании указано с точностью до секунды.

Задача: выполнять задачи в указанное в расписании время (погрешность +/- 2 сек. допустима)

По крону обходить расписание можно не чаще одного раза в минуту. Но как например выполнить действие в 12:00:35 если крон запустит скрипт в 12:00:00. Причем в пределах одной минуты может быть больше одного действия, например, в 12:00:20 и 12:00:50.
  • Вопрос задан
  • 393 просмотра
Подписаться 3 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 4
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
Если нужна такая точность, то только демоном.

upd: Наверное нужно пояснение: Пишешь консольный скрипт с бесконечным циклом который проверяет БД и сравнивает время наступление события с текущим. Если совпадают, то выполняешь. И запускаешь этот скрипт в консоли php /path/to/script/file.php
Ответ написан
Допустим. Каждую минуту доставать из базы задачи на ближайшие 60 секунд, отсортированных по возрастанию. Пройти по ним циклом каждый раз проверяя разницу времени, и устанавливать необходимую задержку, после чего выполнять задание и повторять процесс для следующего.
Ответ написан
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
http://pro-pawn.ru/showthread.php?8215-Оптимизация...

Но проблема на самом деле глубже. Допустим есть 50 событий в пределах секунды. Как бы Вы не создали таймер, если он запускает 1 скрипт, то 50-е событие выполнится после 49-го и т.д. А Если это php и асинхронности выполнения нет - то и о погрешности в 2-секунды можно забыть. Даже если таймер срабатывает с точностью до десятой части секунды.
Поэтому, на мой взгляд, php точно не про это. Как бы я его не любил, но Вам вероятно нужно что-то другое.
Либо как писал Lander запускать кучу "демонов", при этом куча должна быть не малая и реально срабатывать чаще, чем минимально необходимый интервал.
Ответ написан
@alcyone
UNIX-админ
Вставьте в скрипт строку sleep 35.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы