如何实现管理后台可开关的定时任务(计划任务)?

如何做到后台用这种按钮做Laravel定时任务管理的呢?

定时任务管理

在 App\Console\Kernel 类的 schedule 方法中定义调度任务

protected function schedule(Schedule $schedule)
    {
        $schedule->call(function () {
            DB::table('recent_users')->delete();
        })->hourly();
    }

例如我定义了一小时一次的任务调度,但是我想在我自己的管理后台控制它的开启和关闭,如果开启,则执行一小时一次的定时任务,如果关闭则不再执行

你的代码应该是写给下一个开发者的情书。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
Summer
最佳答案

可以参考这个包 github.com/codestudiohq/laravel-to... ,或者直接用。

要实现动态管理,只能通过数据库来记录这些计划任务的状态,例如:

Schema::connection(TOTEM_DATABASE_CONNECTION)
    ->create(TOTEM_TABLE_PREFIX.'tasks', function (Blueprint $table) {
    $table->increments('id');
    $table->string('description');
    $table->string('command');
    $table->string('parameters')->nullable();
    $table->string('expression')->nullable();
    $table->string('timezone')->default('UTC');
    $table->boolean('is_active')->default(true);
    $table->boolean('dont_overlap')->default(false);
    $table->boolean('run_in_maintenance')->default(false);
    $table->string('notification_email_address')->nullable();
    $table->timestamps();
});

然后注册服务替换掉系统的 Schedule ,如:

$this->app->resolving(Schedule::class, function ($schedule) {
        $this->mySchedule($schedule);
});

以上代码来自:github.com/codestudiohq/laravel-to...

3年前 评论
lalall (楼主) 3年前
讨论数量: 12

建议您细化一下问题,这个问题似乎有些宽泛

3年前 评论

把「开关」状态放到数据库,然后使用when去数据库检查状态, 任务调度《Laravel 8 中文文档》

3年前 评论
lalall (楼主) 3年前

@renxiaotu 感谢你的建议: 在 App\Console\Kernel 类的 schedule 方法中定义调度任务

protected function schedule(Schedule $schedule)
    {
        $schedule->call(function () {
            DB::table('recent_users')->delete();
        })->hourly();
    }

例如我定义了一小时一次的任务调度,但是我想在我自己的管理后台控制它的开启和关闭,如果开启,则执行一小时一次的定时任务,如果关闭则不再执行

3年前 评论

如果要彻底点的话,可以这样:

点击开启:启动任务调度服务

点击关闭:停止任务调度服务

但感觉没这个必要,推荐还是@woodong 的方案

3年前 评论

三个思路吧:

  1. 修改crontab中laravel的schedule:run相关的配置
  2. 继承ScheduleRunCommand类,重写handle方法,加入自己的开关状态判断逻辑
  3. 在app\Console\Kernel.php中的schedule方法判断开关状态,打开的话再添加相应的schedule
3年前 评论
protected function schedule(Schedule $schedule)
{
    //  取出全部需要执行的任务 根据执行条件,动态执行
    DB::get()->each(function ($item){
        $schedule->command('schedule:schedule')->everyTenMinutes();
    })
}
3年前 评论

定时任务还是每个小时执行一次,开关配置到一个配置文件,handle里面去判断是开启还是关闭,如果开始就执行具体逻辑,如果关闭,就直接return。

3年前 评论
php_yt 3年前
Summer

可以参考这个包 github.com/codestudiohq/laravel-to... ,或者直接用。

要实现动态管理,只能通过数据库来记录这些计划任务的状态,例如:

Schema::connection(TOTEM_DATABASE_CONNECTION)
    ->create(TOTEM_TABLE_PREFIX.'tasks', function (Blueprint $table) {
    $table->increments('id');
    $table->string('description');
    $table->string('command');
    $table->string('parameters')->nullable();
    $table->string('expression')->nullable();
    $table->string('timezone')->default('UTC');
    $table->boolean('is_active')->default(true);
    $table->boolean('dont_overlap')->default(false);
    $table->boolean('run_in_maintenance')->default(false);
    $table->string('notification_email_address')->nullable();
    $table->timestamps();
});

然后注册服务替换掉系统的 Schedule ,如:

$this->app->resolving(Schedule::class, function ($schedule) {
        $this->mySchedule($schedule);
});

以上代码来自:github.com/codestudiohq/laravel-to...

3年前 评论
lalall (楼主) 3年前

持久化一个key , 如果key 不存在才会走你的定时任务,如果存在就跳过,你是Application 不是OS ,就做好Application做的事情,OS的事情让OS去处理就好了。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!