我们如何允许用户在 Laravel 中从前端设置一个 cron JOB?

How can we allow user to set a cron JOB from frontend in Laravel?

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

现在,我将同步时间存储到数据库 table。现在我想 运行 一个特定用户的 cron JOB。

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

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

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

缺少一些信息,但我尝试假设一些事情,希望使用 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:00null 如果禁用了 cron
  • cron 需要在用户提供的时间运行 每天
  • 导入命令称为 app:import,是一个控制台命令,它接受 user_id 参数和用户 ID 以 运行 导入

这可能会帮助您调整以上内容以适应其在您自己的应用中的结构。


如果您想使用排队的作业来执行导入,您还可以创建 app:import CLI 命令来分派该作业而不是实际 运行 导入。根据导入量,防止长 运行ning 调度程序命令并具有重试和超时的能力可能是个好主意。


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