laravel动态添加调度程序

Sex*_*yMF 4 scheduled-tasks laravel

我有一个系统,用户可以通过UI创建后台任务.
任务间隔是每隔几个小时(UI中的用户选择).

当用户通过ui创建任务时,我想动态地将它添加到调度程序.

如示例所示,这是静态的而不是动态的.

protected function schedule(Schedule $schedule)
{
    $schedule->call(function () {
        DB::table('recent_users')->delete();
    })->daily();
}
Run Code Online (Sandbox Code Playgroud)

可能吗?如果没有,有哪些替代方案?

谢谢

Jon*_*hon 15

我不明白为什么不可能.Kernel::schedule每次运行时都会运行该方法php artisan schedule:run.如果你像文档一样设置它,应该是每分钟通过一个cron.

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

考虑到这一点,我不明白为什么你不能做这样的事情:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

根据您存储的内容,您可以使用此处的任何内容而不是CRON方法.您可能在数据库中存储了一个字符串,表示Laravel的预定义频率之一,在这种情况下,您可以执行以下操作:

$frequency = $task->frequency; // everyHour, everyMinute, twiceDaily etc.
$schedule->call(function() {
    $task->execute();
})->$frequency();
Run Code Online (Sandbox Code Playgroud)

这里要注意的主要事情是,计划实际上并不是在数据库中的任务或它管理的cron中进行调度.每次调度程序运行(每分钟)它都会运行,并根据您为每项任务提供的频率确定要运行的内容.

例:

  • 您可以使用任务设置->hourly(),即每小时运行一次.
  • 00:00,计划运行,->hourly()过滤器通过,因为时间是在一小时,所以您的任务运行.
  • 00:01,计划运行,但这次->hourly()过滤器失败,因此您的任务不会运行.