本站点已停止更新,内容已迁移至 lh1010.com
good luck to you

Laravel 计划任务 任务调度

文章目录

简要说明

  • 常用命令
  • 案例说明
  • 创建定时任务
  • 定义调度任务
  • 验证测试

常用命令

# 查看计划任务是否正确执行
$ php artisan schedule:run

# 单独执行单个任务
$ php artisan cron:syncStock

#同步产品库存案例
php artisan cron:syncStock --sku=UOBG75B

# 查看日志
tail -f  /var/log/demo.com.cron.log

这里是 Laravel 计划任务中常用的命令。在下文需要用的地方会有体现。

案例说明

本文我们计划用 Laravel 的计划任务功能,每分钟同步一个产品的库存数据。

创建定时任务

创建定时任务,启动调度器:

crontab -e
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

本文示例:

* * * * * /usr/bin/php /var/www/demo.com/artisan schedule:run >> /var/log/demo.com.cron.log 2>&1

上面这个 Cron 会每分钟调用一次 Laravel 命令调度器。执行 schedule:run 命令时, Laravel 会根据你的调度运行预定任务。

定义调度任务

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

在开始之前,先看看一个调度任务的例子。在该例子中,我们计划在每分钟同步一个产品的库存数据,即调用一个 SyncStock。在这个 SyncStock 中,将执行同步某个产品的库存:

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected $commands = [
        'App\Console\Commands\SyncStock',
    ];

    protected function schedule(Schedule $schedule)
    {
        $schedule->command('cron:SyncStock --limit=1')->cron('* * * * *');
    }

    protected function commands()
    {
        $this->load(__DIR__.'/Commands');
        require base_path('routes/console.php');
    }
}

接下来,我们去完成 App\Console\Commands\SyncStock 的代码:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Repository\EyaRepository;

class SyncStock extends Command
{
    protected $signature = 'cron:syncStock {--sku=} {--limit=}';

    protected $description = 'Sync Stock Data';

    public function handle()
    {
        $sku = $this->option('sku');
        $limit = $this->option('limit');
        // 这里为同步库存的逻辑代码
        $res = app(EyaRepository::class)->syncStock($sku, $limit);
        // $res成功返回 code = 200
        dd($res);
    }
}

这里对 同步库存的逻辑代码 做下说明:同步 Product 表中的 stock 库存字段。
当 sku 参数存在时,同步指定 sku 产品的库存数据;若 sku 参数不存在,则根据同步时间正序查询查询出来的第一个产品的库存数据,并更新同步时间;
当 limit 参数存在时,同步 limit 个产品的库存数据;当 limit 参数不存在时,同步单个产品的库存数据;

查看计划任务是否正确执行:

php artisan schedule:run

正确执行显示:

Running scheduled command: '/usr/bin/php' 'artisan' cron:syncStock --limit=1 > '/dev/null' 2>&1

接着,我们观察 SyncStock 代码中的:

protected $signature = 'cron:syncStock {--sku=} {--limit=}';

这里是定义的可以接受的两个参数 --sku --limit

--sku:同步指定sku的产品的库存数据;
--limit:一次同步多少产品的库存数据;

我们先来单独执行这个任务:

# 无参数执行
php artisan cron:syncStock

# 同步sku=UOBG75B的产品
php artisan cron:syncStock --sku=UOBG75B

# 同时同步5个产品
php artisan cron:syncStock --limit=5

执行以上命令,操作正确,均打印出 code = 200。

我们现在再去查看 App\Console\Kernel 类的 schedule 方法:

protected function schedule(Schedule $schedule)
{
    $schedule->command('cron:SyncStock --limit=1')->cron('* * * * *');
}

其实就是在服务器上增加一条 Cron 项目,利用 crontab 去执行我们定义的计划任务。

验证测试

打开 Product 表,查看是否为一分钟更新一次产品的库存数据。


参考信息

原文链接:,转发请注明来源!

发表评论