【问题标题】:laravel add scheduler dynamicallylaravel 动态添加调度器
【发布时间】:2016-12-12 14:00:11
【问题描述】:
我有一个系统,用户可以通过用户界面创建后台任务。
任务间隔是每隔几个小时(用户在 UI 中选择)。
当用户通过 ui 创建任务时,我想将其动态添加到调度程序中。
如示例所述,这是静态的而非动态的。
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
DB::table('recent_users')->delete();
})->daily();
}
有可能吗?如果没有,有什么替代方案?
谢谢
【问题讨论】:
标签:
laravel
scheduled-tasks
【解决方案1】:
我不明白为什么这是不可能的。每次运行php artisan schedule:run 时都会运行Kernel::schedule 方法。如果你像文档一样设置它,应该每分钟通过一个 cron。
* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
考虑到这一点,我不明白为什么你不能这样做:
protected function schedule(Schedule $schedule)
{
// Get all tasks from the database
$tasks = Task::all();
// Go through each task to dynamically set them up.
foreach ($tasks as $task) {
// Use the scheduler to add the task at its desired frequency
$schedule->call(function() use($task) {
// Run your task here
$task->execute();
})->cron($task->frequency);
}
}
根据您存储的内容,您可以在此处使用您喜欢的任何内容,而不是 CRON 方法。你可能有一个字符串存储在你的数据库中,它代表 Laravel 的预定义频率之一,在这种情况下你可以这样做:
$frequency = $task->frequency; // everyHour, everyMinute, twiceDaily etc.
$schedule->call(function() {
$task->execute();
})->$frequency();
这里要注意的主要事情是,调度实际上并不是在数据库中的任务中或在它管理的 cron 中调度。调度程序每次运行(每分钟)都会运行,并根据您为每个任务指定的频率确定要运行的内容。
示例:
- 您使用
->hourly() 设置了一个任务,即按小时、每小时运行一次。
- 在
00:00,计划运行,->hourly() 过滤器通过,因为时间到了整点,所以您的任务运行。
- 在
00:01,计划运行,但这次->hourly() 过滤器失败,因此您的任务不会运行。