【问题标题】: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() 过滤器失败,因此您的任务不会运行。

    【讨论】:

    • 我让它与可重用的命令一起工作(唯一的缺点是必须使用与您定义的命令相同的参数#,而不是真正动态地发送您想要的 GUI 允许的任何参数......但是我认为这很好,因为我的命令无论如何都必须知道传入的参数是什么,并且在 $signature 中定义了一个预设的#)。非常感谢您解释如何做到这一点......这是我到目前为止的代码:github.com/armyofda12mnkeys/laravel-task-gui-linkage
    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 2017-03-02
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2018-11-28
    • 2021-03-10
    相关资源
    最近更新 更多