常用命令
# 查看计划任务是否正确执行$ php artisan schedule:run# 单独执行单个任务$ php artisan cron:syncStock#同步产品库存案例php artisan cron:syncStock --sku=UOBG75B# 查看日志tail -f /var/log/demo.com.cron.log
案例说明
本文我们计划用 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 表,查看是否为一分钟更新一次产品的库存数据。
参考信息
- Laravel 任务调度中文文档
- 常用命令
- 案例说明
- 创建定时任务
- 定义调度任务
- 验证测试
