手机版

laravel异步监控定时调度器示例的详细说明

时间:2021-08-22 来源:互联网 编辑:宝哥软件园 浏览:

什么是定时调度程序

默认情况下,Laravel提供了一个定时任务排序功能。在其他php框架下,如果没有这个定时任务,我们就必须运行一些异步脚本,只能依靠系统提供的crontab来完成。这导致我们每次添加定时任务时都要去服务器更改crontab代码并更新配置。

执行命令由php artisan schedule:run执行,那么在哪里执行呢?是的,这个调优仍然需要由我们的crontab执行,但是它只需要配置一次,并且所有后续的计划任务都由我们的业务代码控制

事件

我们有一个导入数据的计划任务

//导入库数据$ schedule-command(self :3360 signature)-无重叠()-everyminute ()-runinbackground()每分钟;RunInBackground()是长时间导入的最佳方式,这意味着异步执行。实际上是通过在shell脚本末尾添加符号,完全依赖linux上的系统来完成的。

这里,withoutOverlapping()用于表示同一时间只能执行一个任务。主逻辑使用排他锁实现,这取决于我们的缓存驱动程序。我这里用的是redis,然后redis提供的密钥随着锁的过期直接过期。

发生故障

在正常情况下,这个任务是完美的,因为只有一个可以同时再次运行,但是在我们的qa学员部署环境后的一天,我们的服务器默默导入了库,因为此时在redis中使用了not Overlapping($ expire _ at=1440)创建了一个锁,这个默认参数就是锁的过期时间。默认值为一天。然后,因为我们的docker环境需要更改参数,重启后端服务器服务,所以我们的重启相当暴力,就是直接发送kill信号,导致里面运行的所有进程瞬间被kill。此时我们redis的锁不足依然存在,大概需要1440分钟。然后,当我们的服务器重启时,发现锁一直存在,没有办法进行后续操作,只能等待。

解决

我可以缩短锁定时间吗?我把它从1天改成了30分钟。没问题。我们在启动第一版计划的时候也是这么做的,官方也可以这么做。

后来我们想,能不能实现一个监控程序?进程退出后,会被监控立即过期,不需要设置固定时间。这当然是所有软件开发人员的理想状态:如果你想打开它,我会把锁去掉,不管它是否正常。

解决办法

描述:

这里,当命令启动时,获取进程的pid,然后分叉子进程,这样就可以将pid传递给子进程。每隔10秒,子进程进行一次探测,以获取父进程的id是否与传入的pid一致。这里普及一个知识点。如果父进程异常退出,如果不退出,子进程将被init进程(pid=1)接管,因此这是一个孤立进程。同时,每次子进程探测时,都会改变redis锁的到期时间。如果探测时间间隔是10s,那么我们的到期时间设置是14s,这就有点多余了。代码实现

代码实现总是那么苍白无力。这里我们写一个laravel的扩展。好处是任何代码都可以在不影响我们主体的情况下完成,我们的laravel可以随意升级。

Github地址:github.com/zzh78727258…

作曲家地址:packagist.org/packages/ze…

摘要

整个实现没有使用ps grep等命令来判断一个进程是否存在,因为我们的docker环境不一定支持这些命令,只是使用简单的pid来和parent_id进行比较。

命令的开头和结尾使用了Laravel的hook方法,我们可以在Listener下监听

公共函数subscribe($ events){ $ events-listen([命令启动:3360 class,//当命令启动时],__CLASS__。@ handle’);}整个代码基于laravel进行扩展,不会影响laravel的升级操作。

好了,这就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。谢谢你的支持。

版权声明:laravel异步监控定时调度器示例的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐