Мое Laravel веб-приложение анализирует тысячи акций каждый день.
После того, как он проанализировал все акции в отдельности, мне нужно запустить функцию один раз , которая генерирует некоторую статистику о фондовом рынке в целом и отправляет электронное письмо с результатами моим пользователям. .
Из-за большого количества данных, которые должны быть обработаны на акцию, мне пришлось использовать Laravel работу на акцию, в противном случае сценарий остановился бы, и мне нужно запустить их asyn c с несколькими работниками, иначе анализ не будет завершен до начала следующего торгового дня.
Мой вопрос: как я могу запустить функцию один раз, когда все задания в очереди завершены?
Я думал о планировании задачи, которая запускается ежедневно при Queue::size() === 0
, используя что-то вроде:
$schedule->call('App\Http\Controllers\DataController@runFinalFunctions')->daily()->when(function () {
// Check if job queue has finished running
if (Queue::size() === 0) {
// Queue empty or finished
return true;
}
});
Но как узнать разницу между пустой очередью, потому что задания еще не начались, и очередь пуста, потому что все задания на этот день закончились?
В идеале у меня не было бы задания CRON, которое продолжает опрос, а скорее обратный вызов at только один раз, когда очередь переходит от наличия рабочих мест к отсутствию рабочих мест.
Есть идеи, как этого добиться элегантно? Я был бы навсегда в вашем долгу: -)