laravel 6 任务调度使用

过去做定时任务,每做一个定时任务,都需要在crontab中增加一个cron入口,很麻烦。

最近看文档中有一个方式可以省却这个步骤,只需要一个cron入口就可以了。

目录

1.创建自定义定时任务

2.修改定时任务文件

3.修改任务调度内核

4.使用过去的方式执行命令

5.使用laravel调度器启动定时命令

6.调度频率设置

7.后台运行命令


1.创建自定义定时任务

项目根目录下执行

php artisan make:command CronTest

即在console目录下创建定时任务文件

2.修改定时任务文件

数据表:

CREATE TABLE `user_role` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL COMMENT '用户id',
  `api_role_id` int(11) NOT NULL COMMENT '角色id',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  KEY `uid_index` (`uid`) USING BTREE,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

代码如下:

<?php

namespace App\Console\Command;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class CronTest extends Command
{

    /**
     * 写入定时命令
     *
     * @var string
     */
    protected $signature = 'cronTest {type}';

    /**
     * 命令说明
     *
     * @var string
     */
    protected $description = '测试定时处理';


    /**
     * 创建新的命令实例
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * 定时任务业务逻辑
     *
     * @return mixed
     */
    public function handle()
    {
        $type = $this->argument('type');
        switch ($type) {
            case 1://
                $this->info('执行入库');
                DB::table('user_role')->insert(['uid' => 1, 'api_role_id' => 1, 'created_at' => date('Y-m-d H:i'), 'updated_at' => date('Y-m-d H:i')]);
                break;
        }
        echo 'success';
        die;
    }
}

3.修改任务调度内核

<?php

namespace App\Console;

use App\Console\Command\CronTest;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * 应用中自定义的 Artisan 命令
     *
     * @var array
     */
    protected $commands = [
        CronTest::class  //注册刚才编写的命令文件类
    ];

4.使用过去的方式执行命令

执行前

执行命令:

 php artisan cronTest 1

执行结果:

这种方式需要在crontab中 定义执行命令的时间的命令文件的路径、参数

 

5.使用laravel调度器启动定时命令

修改任务调度内核

<?php

namespace App\Console;

use App\Console\Command\CronTest;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * 应用中自定义的 Artisan 命令
     *
     * @var array
     */
    protected $commands = [
        CronTest::class
    ];

    /**
     * 定义应用程序的命令计划
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // 每分钟执行一次 cronTest 1 命令
        $schedule->command('cronTest 1')->everyMinute();
    }

    /**
     * 为应用程序注册命令
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }

    /**
     * 多个计划事件默认使用的时区。
     *
     * @return \DateTimeZone|string|null
     */
    protected function scheduleTimezone()
    {
        return 'Asia/Shanghai';
    }
}

执行命令:

php artisan schedule:run

执行结果:

能达到同样效果,最后需要把调度器加入cron中,就可以直接加一次便足够运行所有项目添加的定时任务。

命令如下:

* * * * * cd /path-to-your-project && php artisan schedule:run

 

6.调度频率设置

 

7.后台运行命令

默认情况下,计划同时运行的多个命令将会顺序执行。若你有长时间运行的命令,这可能导致后续命令的启动时间比预期的更晚。

可以使用 runInBackground 方法让命令在后台运行,这样可以同时运行多个命令。

$schedule->command('cronTest 1')->everyMinute()->runInBackground();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值