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占用很高,后面就瘫痪了。


慕仙森
浏览 476回答 1
1回答

缥缈止盈

这种程序一般只会开启一个,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(); }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java