资讯专栏INFORMATION COLUMN

Laravel 技巧之 定时任务

keithyau / 1324人阅读

摘要:对于定时任务的基本用法,官网文档已经描述得很详细了,这里不再多说。这种情况下如果定时任务能够并行执行,就不会有这样的问题。这个时候我们希望能够像队列那样,将定时任务分散到多台服务器上。

定时任务 Scheduled Tasks 是 Laravel 提供的组件之一,稍微上点规模的项目应该都会用到,比如开发微信应用时通过定时任务去刷新access token,比如每天定时发推送提现用户要记得签到。对于定时任务的基本用法,官网文档已经描述得很详细了,这里不再多说。

本文主要是介绍定时任务在实际应用中的两个小技巧:

1. 多个任务并行执行

先简单介绍一下 Laravel 定时任务组件的基本原理:

当cli初始化完毕之后,系统会调用 AppConsoleKernel::schedule 方法,也就是我们定义定时任务列表的地方,这个方法里每调用一次 $schedule->command() 就会生成一个 IlluminateConsoleSchedulingEvent 对象并保存在 $schedule->events 数组里。当执行 php artisan scheduled:run 时,系统会遍历 $schedule->events,把当前时间需要执行的任务放在一个集合中,最后依次 串行执行 这些任务。

这样做在大多数情况下是没有问题的,但有一些特殊的情况,比如在每个月的第一天要给100W个用户发送邮件,同一批次的定时任务必须等到这些邮件全部发送完毕之后才会被执行,假如这些任务里有对执行时间十分敏感的任务,比每5分钟一次的数据快照,就会导致那个时间点数据的缺失。

这种情况下如果定时任务能够并行执行,就不会有这样的问题。Laravel 实际上提供了解决方案,但很奇怪文档里面并没有提到,就是 runInBackground 方法,在定义定时任务时 $schedule->command("foo:bar")->everyMinutes()->runInBackground(); 就可以了。

2. 负载均衡

随着业务逻辑的增多,定时任务也会越来越多,定时任务服务器的负载也会越来越高,甚至导致任务执行缓慢,然而我们却只能在一台服务器上设置定时任务,如果在多台服务器上同时配置了定时任务,还会导致定时任务的重复执行。这个时候我们希望能够像队列那样,将定时任务分散到多台服务器上。

截止 v5.4.15,Laravel 还没有提供内置方案来解决这个问题,但只需要简单的改造就可以实现我们需要的效果。首先我们把将每个定时任务里 handle 方法提取出来创建一个新的Job并继承 ShouldQueue,然后在定时任务的 handle 里直接 dispatch 对应的Job即可,这样原本的业务逻辑就会被队列处理掉,当系统有多台服务器在处理队列时,也就实现了我们需要的负载均衡。

但是这样毕竟还是麻烦,每个定时任务都要创建一个Command和一个Job,太费劲,于是我提交了一个 Proposal ,目前已经实现并且merge入5.4分支,相信下个版本大家就能用上了。用法也很简单,只需要创建一个继承 ShouldQueue的Job,然后在AppConsoleKernel::schedule 方法里定义

$schedule->job(new FooBarJob())->everyMinutes();

就可以了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22487.html

相关文章

  • 高性能千万级定时任务管理服务forsun laravel插件使用详解

    摘要:高性能高精度定时服务,轻松管理千万级定时任务。支持任务到期触发和。支持创建延时任务和定时到期任务,和原生保持相同接口,轻松使用。不支持任务输出任务钩子及维护模式。是不指定任务名时自动生成,每个任务名必须唯一,相同任务名重复定义将会自动覆盖。 Forsun高性能高精度定时服务,轻松管理千万级定时任务。 定时服务项目地址:https://github.com/snower/forsun l...

    Muninn 评论0 收藏0
  • 创业初期数据库云备份laravel解决方案

    摘要:在中注册发布之后,我们会产生一个监听器,文件已经存储在本地,获取该文件信息将文件上传至七牛云存入数据库上面的部分代码没写,大家可以去自己去试下,加深对七牛云及的理解,完全可以达到目的。 最近项目用户徒增,购买的服务器还是和公司另外一个项目共用的同一台服务器,想着要是服务器崩了,还没个容灾方案,万一。。。不得被用户整死 选用方案 laravel-backup 配合laravel的任务调...

    2bdenny 评论0 收藏0
  • Laravel 5.7 最佳实践和开发技巧分享

    摘要:当查询数据时,本地范围允许我们创建自己的查询构造器链式方法。这样便会知道这是一个本地范围并且可以在查询构造器中使用。某些查询构造器不可用或者说可用但是方法名不同,关于这些请查阅所有集合的方法。 showImg(https://segmentfault.com/img/remote/1460000017877956?w=800&h=267); Laravel 因可编写出干净,可用可调试的...

    ninefive 评论0 收藏0
  • Laravel 执行用户自定义的定时任务

    摘要:原文来自问题在中,如果我们想使用定时任务的话,对应我们开发人员来说非常简单,只需要参照官网的定时任务文档基本就可以实现了。总结以上就简单实现了执行用户自定义定时任务的需求。 原文来自 https://www.codecasts.com/blo... 问题 在 Laravel 中,如果我们想使用定时任务的话,对应我们开发人员来说非常简单,只需要参照官网的定时任务文档基本就可以实现了。 然...

    izhuhaodev 评论0 收藏0
  • 个人整理, 阅读过的好文章 (每天随时更新)

    摘要:大家有好的文章可以在评论下面分享出来共同进步本文链接数组使用之道程序员进阶学习书籍参考指南教你在不使用框架的情况下也能写出现代化代码巧用数组函数框架中间件实现没错,这就是面向对象编程设计模式需要遵循的个基本原则令人困惑的在中使用协程实现多任 大家有好的文章,可以在评论下面分享出来, 共同进步! 本文github链接 php PHP 数组使用之道 PHP程序员进阶学习书籍参考指南 教你...

    Chiclaim 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<