Laravel Queues 队列应用实战 (3)

Laravel Queues 队列应用实战

Laravel Queues 队列应用实战

并且,由于我们设置了30秒重试,并且限制了最多尝试执行3次,所以在 failed_jobs 数据表中,也会记录任务执行超过指定次数的失败信息:

Laravel Queues 队列应用实战

要停止队列,只需在命令行窗口 ctrl+c 中断当前进程即可。

剩下的,自然就是写上合理的业务逻辑代码,比如调用百度AI图片审核接口,在其返回 download image error 时,通过 $this->release(300) 将其放回队列,并让它5分钟后再试。而5分钟后,CDN应该就有了图片的缓存,自然百度AI审核接口去下载图片就会毫无障碍了,并且也杜绝了如若一直拿不到图片,就会一直失败下去,从而浪费图片审核免费额度的问题。

练气期 和 筑基期 修士,别被 supervisor 吓到了

可是,现在大多数人心中还盘旋着一个问题:启动队列的命令执行后,其一直占用当前命令行窗口,当关掉窗口后,队列进程也会被关掉,那有什么方法,能让其在后台运行呢?于是,看到官方文档提到的用 supervisor 来管理进程,从而实现让队列进程后台运行。

我最近一段时间,迷上了听 凡人修仙传,里面把修仙者的功力分为这么几个层次:练气期、筑基期、结丹期、元婴期、化神期...以在下这十几年的修为,自忖勉强能腆列结丹初、中期的境界,其后还有结丹后期、元婴初期、元婴中期、元婴后期,而大部分跻身元婴期的前辈高人,待到寿元将近,也无法突破元婴初期,可见越往后,修炼越是难上加难。在下即使穷尽一生,估计也只能到结丹后期,顶多假婴的境界,往后哪怕再进一步,都是痴心妄想。至于化神,呵呵,简直就是...

而当练气期和筑基期的道友,第一次看到 supervisor 的时候,估计是会被懵到了,这是什么东西?我没见过你,啊~不要过来...

没关系,我们当然可以不用 supervisor,也可以让队列进程在后台运行,如何实现?如果你认真看了,并且理解了 后台程序在处理繁重的任务时,调用外部程序异步执行的简单实现 这篇文章所讲述的内容,我想实现方法,就无需多言了,其核心无非就是 nohup 要执行的命令 > /dev/null 2>&1 &,如此,可让队列进程处于后台运行。

用上 supervisor 让你更省心

虽然,我们可以跳过 supervisor,也可以让队列进程处于 background 后台运行,但是重启队列很麻烦。要知道,队列进程是常驻内存的,它在启动时,加载的应用的一些数据,会长久的保存在内存中,其后,你对应用的代码所做的一些修改和调整,都必须要重启队列进程,才会生效。所以,当你修改了你的 Job 任务中的代码后,你需要重启队列。而官方文档中提到,重启队列的命令是:

php artisan queue:restart

不幸的是,当你运行了上面的命令,你会发现,虽然你的队列进程被 kill 掉了,但是它并没有再次启动啊,下面只能自己手动的启动它。这是因为,上述命令只是发送了杀掉当前队列进程的信号,但是再次启动,实际上却是交由 supervisor 完成的。这就是我们需要 supervisor 的原因,能让你重启的时候,更爽一点。

那如何通过 supervisor 来管理我们的进程,实现进程被杀掉后,自动启动,以保持其始终处于运行状态的目的呢?

别怕,整个过程,其实也很简单。

首先,在 linux 服务器上,通过包管理器 yum 或 apt-get【视你所用的linux版本而定】,安装 supervisor,然后找到其配置文件 /etc/supervisord.conf【文件位置视你具体情况而定】,翻到最底下一行配置:

[include] files = supervisord.d/*.ini

保证此行配置没有被注释掉,然后找到 supervisord.d 目录,在其中新建 my-app-worker.ini 文件,文件名最好【因为我没尝试过不一致会如何】和下面配置中的 my-app-worker 保持一致,至于具体叫什么,可自行修改,内容类似如下:

[program:my-app-worker] process_name=%(program_name)s_%(process_num)02d command=php /www/wwwroot/my_laravel_project/artisan queue:work --sleep=3 --tries=3 autostart=true autorestart=true user=www numprocs=1 redirect_stderr=true stdout_logfile=http://www.likecs.com/www/wwwroot/my_laravel_project/storage/logs/worker.log

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspdzp.html