个人理解的适应场景:较小的主从项目,只有两台服务器,不期望引入成熟的分布式任务调度程序,尽量用代码和日志去控制,可以用到 Laravel 任务调度的这几个特性。这些特性在5.6 版本的时候开始增加的,注意自己的项目版本
withoutOverlapping()
避免重复执行。例如十分钟执行一次的定时任务,上一个任务十分钟内没执行完成,而下一个任务直接开始执行,容易造成混淆。这种情况下就可以使用 withoutOverlapping()
方法对当前任务加锁,锁默认的失效时间为 24 小时,这个方法还提供一个参数,用于指定在锁失效前经历了多长时间,以分钟为单位,用法 withoutOverlapping($minutes)
。
onOneServer()
限制在一台服务器上执行。多台服务器的情况下,限制只在一台服务器上执行某个任务,可以使用 onOneServer()
方法,原理是获取到该任务的第一台服务器将对该任务加上原子锁,以防止其他服务器同时运行相同的任务。注意:使用这个功能,必须使用 memcached 或 redis 作为你应用程序的默认缓存驱动程序。另外,所有服务器都必须与同一个中央缓存服务器进行通信。
after()
任务钩子。通过 before
与 after
方法,你可以指定要在调度任务完成之前和之后执行的代码。重点可以是 after
方法,扩展进行任务执行失败的重试。
例如:每十分钟统计一次订单数据,新增订单等数据,将统计结果记录到 order_statistics
表,任务执行完毕后,在 after
检查是否有当前时间对应的成功和统计日志,如果没有对应数据,可以 sleep 一分钟,再次重试任务,同时记录一下当前时间的第几次重试,而下次重试可以 sleep 2分钟,第三次直接发邮件通知负责人员,自动完成任务失败情况下的补偿也失败了,让开发人员检查错误原因。
OutputTo()
任务输出结果。主要是 sendOutputTo($filePath)
输出到文件,appendOutputTo($filePath)
追加到文件 及 emailOutputTo('foo@example.com')
通知指定邮件三个输出方法,最后者需要先行配置邮件服务。注意:emailOutputTo、sendOutputTo 和 appendOutputTo 方法是 command 和 exec 方法独有的
参考链接:Laravel 任务调度中文文档
比较基础使用的可以参考中文文档,这里主要是在基础调度之外的几个操作。
最后恰饭 阿里云全系列产品/短信包特惠购买 中小企业上云最佳选择 阿里云内部优惠券