Я новичок в Heroku. Я пытаюсь достичь чего-то простого (по крайней мере, я надеюсь), но, похоже, прямого пути для этого нет.
У меня есть несколько файлов PHP, которые я пытаюсь запустить как запланированное задание (каждые 5 минут). Эти прогоны иногда могут занимать более 30 секунд. Следовательно, как я понимаю, мне нужно назначить их рабочими местами.
Пример, приведенный на Heroku, кажется сложным примером, из которого я не смог понять, как существующий файл PHP должен быть помечен как рабочий.
Кроме того, я хотел бы запланировать выполнение этой рабочей задачи каждые 5 минут. Документы относятся к пользовательским часам, но для PHP нет примера.
Может, кто-нибудь подскажет мне учебник о том, как использовать рабочие процессы и планировать их в Heroku для PHP-программ? Что-то новичок может следовать.
Спасибо!
Работа Часы Процесс в этом случае заключается в том, чтобы вызвать другой кусок кода, давайте назовем его планировщик, на регулярном периодическом интервале. В качестве аргумента допустим, что наш планировщик будет ожидать вызова каждую минуту. Именно так настроены планировщик laravel и, следовательно, часы-героку, которые я использую (и написал).
Чего мы пытаемся достичь здесь? Чтобы часы были хорошими, они должны иметь определенную степень надежности. Мы не говорим о микросекундной точности или о чем-то подобном. Мой собственный критерий дизайна заключается в том, что часы должны вызывать планировщик каждую минуту. Это все, что мне нужно. На практике это происходит в течение первых пяти секунд каждой минуты в соответствии с проведенными мною тестами (мой код часов находится у подножия этого ответа — но пока не смотрите!).
В ваших часовых процессах на Герою будет запись в профиле вроде clock: php artisan clock
, Это в случае с Laravel. Это просто запускает команду php, которая содержит часы.
Что делают часы? Все, что он делает, это вызывает планировщик вызовов, регулярно, раз в минуту.
Что делает планировщик? Он предоставляет способ указать, когда вы хотите запускать задания (ежедневно, еженедельно, 14:00 по вторникам и т. Д.). Когда вызывается планировщик, все, что ему нужно сделать, это проверить в списке всех расписаний, которые вы просили его сделать, и спросить: «Что-нибудь, что мне нужно сделать в эту конкретную минуту?». Если он что-то находит, он запускает его (ваш dyno часов / планировщика должен отправлять рабочему, а не запускать задание напрямую, чтобы помочь ему оставаться надежным), в противном случае он говорит: «В настоящее время не запланировано выполнение задач» и завершает работу. , Затем часы снова звонят в следующую минуту и так далее.
Я понимаю, что OP указал php и не упомянул laravel, извините, если этот ответ окажется немного специфичным для laravel, но это то, что я знаю. Вот планировщик Команда в случае с Laravel. Это предоставляет вам весь код, который вам нужен для составления расписания, все, что вам нужно, это вызывать его поминутно. Введите часы. Не-героку способ установить это добавить один Запись cron, которая вызывает это каждую минуту. На Heroku мы просто используем процесс часов, который служит точно такой же цели — просто вызывает эту команду раз в минуту.
Таким образом, ваша задача, если вы решите принять ее, это написать крошечную php-программу, которую вы будете запускать как демон (все динамы heroku, указанные в Procfile, запускаются как демоны, то есть непрерывно) (запись в procfile, которая не была t демон не имеет к этому никакого смысла), чья работа заключается в том, чтобы сидеть там бегать, возможно, немного поспать, затем проснуться и упорядочить себя так, чтобы он вызывал ваш планировщик, например $this->call('schedule:run')
раз в минуту. Это все, что нужно сделать часам, остальное зависит от программы планировщика, какой бы ни была ваша.
Писать настоящие часы — это небольшая забавная задача, и вам определенно было бы полезно самим сформулировать эту проблему и подумать над ней, прежде чем изучать мой ответ!
Вот то, что я использую для своего демона часов (удалено ведение журнала для конкретной среды). Команда, которая содержит этот код в качестве своего тела, называется в Procfile часами.
while(true) {
if (now()->second <= 10) // "runnable window"{
$this->call('schedule:run');
sleep(4); // "min. duration"}
sleep(7); // "polling delay"}
Вы должны подумать об этом и проверить это самостоятельно, просто войдя в систему, а не вызывая расписание, чтобы начать, и посмотрите на это в ваших журналах. Это работает до тех пор, пока процесс создания часов / планировщика не займет более 30 секунд. Вы можете добиться этого, отправляя задачи от него своему рабочему, и не выполняя долго выполняющихся заданий в часах (как советуют документы heroku), или он пропустит следующую минуту, потому что часы все еще будут связаны при работе планировщика. с предыдущей минуты.
Заметьте, что динос перезагружается каждый день. Так что я позволил этому бежать & проверил, звонил ли он надежно каждую минуту даже через циклы динамометра. Вы можете видеть, что код допускает до примерно 10 секунд простоя процесса синхронизации для покрытия перезапуска dyno. Я не знаю наверняка, каково максимальное отключение динамо на героку, оно показалось намного меньше, чем 10 секунд. Эти интервалы работали хорошо для меня, и я уверен, что в моем случае использования (ничего абсолютно критического), что это имеет надежность, это хорошо. Было бы возможно настроить более тщательные тесты, чем я на самом деле сделал. Мне было бы интересно услышать результаты, если кто-нибудь сделает это. Включите ваши часы и заставьте их регистрироваться, когда они звонят, & смотреть его поведение, когда вы нажимаете код & на ежедневный перезапуск, чтобы дать вам уверенность в том, как он себя ведет. Я мог бы написать это лучше, чем это, если у меня будет время! В то же время, надеюсь, это поможет. Это зависит от того, как именно герою циклически повторяет свои динамо, и, следовательно, от важности тестирования, по крайней мере, так я это вижу. Там может быть лучший алгоритм для этого, если у кого-то есть, я все уши.
Наконец, чтобы ответить на OP, вы можете установить «часы», которые вызывают один раз в 5 минут, но я подозреваю, что вам лучше настроить часы, которые вызывают каждую минуту, и вызывать из них планировщик, который просто спрашивает: «текущее время в секундах по модулю пять секунд равно нулю», а затем отправляет задание работнику если это. Это означает, что вы можете проверить свои часы, а мы можем разработать и поделиться результатами общего решения здесь.
Других решений пока нет …