Laravel 任务调度的几个高阶特性

Laravel 任务调度的几个高阶特性

author: he xiaodong date: 2019-04-24

个人理解的适应场景:较小的主从项目,只有两台服务器,不期望引入成熟的分布式任务调度程序,尽量用代码和日志去控制,可以用到 Laravel 任务调度的这几个特性。这些特性在5.6 版本的时候开始增加的,注意自己的项目版本

withoutOverlapping()

  避免重复执行。例如十分钟执行一次的定时任务,上一个任务十分钟内没执行完成,而下一个任务直接开始执行,容易造成混淆。这种情况下就可以使用 withoutOverlapping() 方法对当前任务加锁,锁默认的失效时间为 24 小时,这个方法还提供一个参数,用于指定在锁失效前经历了多长时间,以分钟为单位,用法 withoutOverlapping($minutes)

onOneServer()

  限制在一台服务器上执行。多台服务器的情况下,限制只在一台服务器上执行某个任务,可以使用 onOneServer() 方法,原理是获取到该任务的第一台服务器将对该任务加上原子锁,以防止其他服务器同时运行相同的任务。注意:使用这个功能,必须使用 memcached 或 redis 作为你应用程序的默认缓存驱动程序。另外,所有服务器都必须与同一个中央缓存服务器进行通信。

after()

  任务钩子。通过 beforeafter 方法,你可以指定要在调度任务完成之前和之后执行的代码。重点可以是 after 方法,扩展进行任务执行失败的重试。
例如:每十分钟统计一次订单数据,新增订单等数据,将统计结果记录到 order_statistics 表,任务执行完毕后,在 after 检查是否有当前时间对应的成功和统计日志,如果没有对应数据,可以 sleep 一分钟,再次重试任务,同时记录一下当前时间的第几次重试,而下次重试可以 sleep 2分钟,第三次直接发邮件通知负责人员,自动完成任务失败情况下的补偿也失败了,让开发人员检查错误原因。

OutputTo()

  任务输出结果。主要是 sendOutputTo($filePath) 输出到文件,appendOutputTo($filePath) 追加到文件 及 emailOutputTo('foo@example.com') 通知指定邮件三个输出方法,最后者需要先行配置邮件服务。注意:emailOutputTo、sendOutputTo 和 appendOutputTo 方法是 command 和 exec 方法独有的

参考链接:Laravel 任务调度中文文档

比较基础使用的可以参考中文文档,这里主要是在基础调度之外的几个操作。