我们如何允许用户从Laravel的前端设置cron JOB?

时间:2019-07-05 11:45:44

标签: php laravel cron scheduling cron-task

我的laravel应用程序中有一个设置部分。在本节中,我有一个定义同步时间的设置。因此,用户可以设置从laravel应用程序到第三方CRM(Salesforce)的数据同步的首选时间。

现在,我将同步时间存储到数据库表中。现在,我想在那时为特定用户运行cron JOB。

我已经创建了cron作业脚本,并且cron作业脚本运行正常。我能够手动测试cron作业,我只需要使用用户设置(首选时间)将其自动化即可。 我的Cron工作网址https://my-domain.org/cronjob?user_id=101

我尝试使用laravel scheduling,但这不能满足我的要求。

laravel是否还有其他更好的解决方案?

1 个答案:

答案 0 :(得分:1)

缺少一些信息,但是我尝试假设一些事情,希望可以使用Laravel调度程序提出一个可行的解决方案。


假设您将CRON在晚上1点存储为01:00在数据库中的运行时间,您可以执行以下操作:

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);
    });
}
  • 我梦想着您将信息存储在用户模型上
  • 您在名为cron_time的数据库中使用了一个标志,该标志包含01:00或如果禁用了cron则为null
  • cron需要在用户提供的时间每天运行
  • 导入命令称为app:import,它是一个控制台命令,它接受带有用户ID的user_id参数来为其运行导入

这可以帮助您使以上内容适应您自己的应用程序中的结构。


如果要使用排队的作业来执行导入,则还可以创建app:import CLI命令来仅调度该作业,而不实际运行导入。根据导入数量的不同,最好避免长时间运行调度程序命令并具有重试和超时的功能。


另一个选择还可以是使用每日计划的命令,该命令将作业分派到计划在特定时间运行的队列(不适用于SES驱动程序)。有关更多信息,请参见:https://laravel.com/docs/5.8/queues#delayed-dispatching