laravel 动态添加调度器

Posted

技术标签:

【中文标题】laravel 动态添加调度器【英文标题】:laravel add scheduler dynamically 【发布时间】:2016-12-12 14:00:11 【问题描述】:

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

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

如示例所述,这是静态的而非动态的。

protected function schedule(Schedule $schedule)

    $schedule->call(function () 
        DB::table('recent_users')->delete();
    )->daily();

有可能吗?如果没有,有什么替代方案?

谢谢

【问题讨论】:

【参考方案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() 过滤器失败,因此您的任务不会运行。

【讨论】:

我让它与可重用的命令一起工作(唯一的缺点是必须使用与您定义的命令相同的参数#,而不是真正动态地发送您想要的 GUI 允许的任何参数......但是我认为这很好,因为我的命令无论如何都必须知道传入的参数是什么,并且在 $signature 中定义了一个预设的#)。非常感谢您解释如何做到这一点......这是我到目前为止的代码:github.com/armyofda12mnkeys/laravel-task-gui-linkage

以上是关于laravel 动态添加调度器的主要内容,如果未能解决你的问题,请参考以下文章

动态添加字段到 laravel 表单

在 Laravel 5 中验证动态添加的输入字段

在 laravel 中动态无限制地添加字段

laravel 中动态输入字段的验证

Laravel 表单请求动态字段在重定向时消失

如何动态添加选择器