laravel默认提供了一个命令定时任务的功能,在其余的php框架下面,没有这个定时任务,咱们要跑一些异步脚本怎么操做呢,只能依赖咱们系统提供的crontab来作,这就致使咱们每次发版本新增定时任务都要去服务器更改crontab代码,获取更新这个配置。php
执行命令是php artisan schedule:run 来执行,那放在哪里执行呢,没错这个调起仍是须要依赖咱们crontab来执行,可是只须要配置一次,后续全部定时任务都在咱们业务代码进行控制linux
咱们有一个导入数据的定时任务laravel
//每分钟导入库数据
$schedule->command(self::SIGNATURE)->withoutOverlapping()->everyMinute()->runInBackground();
复制代码
这个任务在正常状况下都是很是完美的,由于同一时刻只有一个再跑,跑完就能够,可是一个场景出现git
有一天咱们的qa同窗刚部署环境后,咱们服务端就在默默的导入库了,由于使用withoutOverlapping($expire_at=1440)这个时候在redis就有一个锁产生了,这个默认带参数是锁的过时时间,默认是一天,而后由于咱们docker环境须要更改参数而后进行后端server服务的重启,咱们重启也是比较暴力,就是直接发送kill的信号,致使全部在里面跑的进程瞬间kill,而这时候咱们的redis的锁缺还存在,并且是1440分钟左右,那当咱们server再启动后,发现锁一直存在,没办法进行后续的操做了,只能等着。github
说明:redis
代码实现老是那么苍白无力哈,这里就写一个laravel的扩展来作,好处就是不影响咱们主体的任何代码就完成了,咱们的laravel能够随意升级。docker
github地址:github.com/zzh78727258…shell
composer地址:packagist.org/packages/ze…后端
public function subscribe($events)
{
$events->listen(
[
CommandStarting::class, // 命令开始的时候
],
__CLASS__ . '@handle'
);
}
复制代码