php rabbitmq消费者程序crontab定时执行后出现很多连接,导致服务器瘫痪,如何解决?

问题描述

框架说明:自己公司用composer搭建的框架,而非tp,laravel等。
rabbitmq库:"php-amqplib/php-amqplib": "^2.8"
php版本:7.0+
linux:nginx

我写了一个消费队列的php,然后使用crontab定时每分钟跑一次,也可以消费。后来发现crontab每次执行代码后,都不会关闭connection和channel。因为消费者程序里面有这样的代码,按照rabbitmq官方demo写的,这里有个infinite loop.

while (count($this->channel->callbacks)) {    $this->channel->wait();
}

程序在这里进行阻塞了,所以crontab每过一分钟执行一次,就多一个conectiion,都没有退出。

问题出现的环境背景及自己尝试过哪些方法

主要是用来取出来消费队列里的消息,我自己本机使用php /path/to/consumer.php 是可以的,不过都是ctrl+c来退出的。但是如果真正放在linux要怎么调用呢?

  • 我再想是不是不该用crontab定时任务,而要用nohub这样的常驻程序来执行。

  • 或者说是如何让程序跳出那个infinite loop?

相关代码

while (count($this->channel->callbacks)) {    $this->channel->wait();
}

你期待的结果是什么?实际看到的错误信息又是什么?

目前使用crontab定时每分钟跑的结果就是每次都会创建一个connection,然后都没关闭,最后就N个connection,服务器cpu rabbitmq占用很高,后面就瘫痪了。


RISEBY
浏览 1802回答 3
3回答

眼眸繁星

可以改成nohup常驻进程的方式运行,不用定时任务。

繁花不似锦

这种程序一般只会开启一个,crontab的功能除了开启程序,还要监控这个程序是否挂了,如果挂了就重新启动。所以,只需要在程序前面加一个检测代码就可以了<?php//&nbsp;脚本名称$ps_name&nbsp;=&nbsp;'my_ps_name';//&nbsp;$1为用户名,$2为PID$cmd&nbsp;=&nbsp;"ps&nbsp;-ef|grep&nbsp;{$ps_name}|grep&nbsp;-v&nbsp;grep|awk&nbsp;'{print&nbsp;$1,&nbsp;$2}'"; exec($cmd,&nbsp;$out);if&nbsp;(!empty($out))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;exit("服务正在运行,跳过"&nbsp;.&nbsp;PHP_EOL); }while&nbsp;(count($this->channel->callbacks))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;$this->channel->wait(); }

慕的地6264312

你的需求是常驻。问题的原因是每分钟都跑1个进程,但是又不会退出,时间一久就出问题了。比较保险的方式是使用文件锁,连接队列之前获取锁,锁失败就退出进程,锁成功就连接队列,进程挂了会自动释放锁,再配合crontab即可不用crontab的话,你进程挂了没人把他搞起来$fp&nbsp;=&nbsp;&nbsp;fopen('lock','r'); $locked&nbsp;=&nbsp;flock($fp,LOCK_EX|LOCK|UB);if(!$locked)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;die("获取锁失败"); } //&nbsp;连接队列
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Html5
Java