为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕仙森 2019-02-15 16:53:22
问题描述框架说明:自己公司用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占用很高,后面就瘫痪了。
查看完整描述

1 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

这种程序一般只会开启一个,crontab的功能除了开启程序,还要监控这个程序是否挂了,如果挂了就重新启动。
所以,只需要在程序前面加一个检测代码就可以了

<?php// 脚本名称$ps_name = 'my_ps_name';// $1为用户名,$2为PID$cmd = "ps -ef|grep {$ps_name}|grep -v grep|awk '{print $1, $2}'";
exec($cmd, $out);if (!empty($out)) {    exit("服务正在运行,跳过" . PHP_EOL);
}while (count($this->channel->callbacks)) {    $this->channel->wait();
}


查看完整回答
反对 回复 2019-02-15
  • 1 回答
  • 0 关注
  • 475 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信