我的laravel应用程序中有一个设置部分。在本节中,我有一个定义同步时间的设置。因此,用户可以设置从laravel应用程序到第三方CRM(Salesforce)的数据同步的首选时间。
现在,我将同步时间存储到数据库表中。现在,我想在那时为特定用户运行cron JOB。
我已经创建了cron作业脚本,并且cron作业脚本运行正常。我能够手动测试cron作业,我只需要使用用户设置(首选时间)将其自动化即可。 我的Cron工作网址https://my-domain.org/cronjob?user_id=101
我尝试使用laravel scheduling,但这不能满足我的要求。
laravel是否还有其他更好的解决方案?
答案 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
app:import
,它是一个控制台命令,它接受带有用户ID的user_id
参数来为其运行导入这可以帮助您使以上内容适应您自己的应用程序中的结构。
如果要使用排队的作业来执行导入,则还可以创建app:import
CLI命令来仅调度该作业,而不实际运行导入。根据导入数量的不同,最好避免长时间运行调度程序命令并具有重试和超时的功能。
另一个选择还可以是使用每日计划的命令,该命令将作业分派到计划在特定时间运行的队列(不适用于SES驱动程序)。有关更多信息,请参见:https://laravel.com/docs/5.8/queues#delayed-dispatching。