Как мы можем разрешить пользователю устанавливать cron JOB из внешнего интерфейса в Laravel? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть раздел настроек в моем приложении laravel. В этом разделе у меня есть настройка для определения времени синхронизации. Таким образом, пользователь может установить предпочтительное время для синхронизации данных из приложения laravel с CRM сторонней организации (Salesforce).

Сейчас я сохраняю время синхронизации в таблице базы данных. Теперь я хочу запустить cron JOB в то время для конкретного пользователя.

Я уже создал скрипт задания cron, и скрипт задания cron работает нормально. Я могу проверить работу cron вручную, мне просто нужно автоматизировать ее с помощью настроек пользователя (предпочтительное время). URL моего задания Cron https://my -domain.org / cronjob? User_id = 101

Я пытался использовать планирование laravel , но это не соответствовало моему требованию.

Есть ли другое лучшее решение, доступное на laravel?

1 Ответ

1 голос
/ 05 июля 2019

Некоторая информация отсутствует, но я пытаюсь предположить несколько вещей, которые, мы надеемся, предложат рабочее решение с использованием планировщика 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.

...