Некоторая информация отсутствует, но я пытаюсь предположить несколько вещей, которые, мы надеемся, предложат рабочее решение с использованием планировщика Laravel.
Предполагая, что вы храните время, в которое CRON работает в базе данных, как 01:00
в течение 1 часа ночи, вы можете сделать следующее:
protected function schedule(Schedule $schedule)
{
User::query()->whereNotNull('cron_time')->each(function (User $user) use ($schedule) {
$schedule->command('app:import', ['user_id' => $user->id])
->withoutOverlapping() // prevents running the same command (+ parameters) twice at the same time, should only be a problem if the command can run > 24 hours, but still a safe thing to do
->dailyAt($user->cron_time);
});
}
- Мне приснилось, что вы сохранили информацию о модели User
- То, что вы использовали флаг в базе данных под названием
cron_time
, который содержит 01:00
или null
, если cron отключен
- Крон должен запускаться ежедневно в указанное пользователем время
- Команда импорта называется
app:import
и представляет собой консольную команду, которая принимает аргумент user_id
с идентификатором пользователя для запуска импорта для
Это может помочь вам адаптировать вышеприведенное к тому, как оно структурировано в вашем собственном приложении.
Если вы хотите использовать задания в очереди для выполнения импорта, вы также можете создать команду CLI app:import
, чтобы просто отправить это задание вместо фактического запуска импорта. В зависимости от объема импорта может быть полезно предотвратить длительные команды планировщика и иметь возможность повторить попытку и установить тайм-аут.
Другим вариантом может также быть ежедневная запланированная команда, которая отправляет задания в очередь, запланированную для запуска в определенное время (которая не работает с драйвером SES). Подробнее об этом см .: https://laravel.com/docs/5.8/queues#delayed-dispatching.