php如何使用rabbitmq实现发布消息和消费消息(一对多)(tp框架)(第二篇)
一个publisher发布消息 多个个customer接受消息
1:准备工作参照:
http://www.cnblogs.com/spicy/p/7886820.html
2,:路由:
3: 方法:”
public function callFunc($msg) { echo " [x] Received ", $msg->body, "\n"; if($msg->body==2){ sleep(50); }else{ sleep($msg->body); } // sleep(substr_count($msg->body, '.')); echo " [x] Done", "\n"; } public function worker() { set_time_limit(0); $connection = new AMQPStreamConnection('localhost', 5672, 'bitch', 'bitch'); $channel = $connection->channel(); $channel->queue_declare('hello', false, true); $receiver = new self(); #下面第四个参数如果为true表示开启确认模式,也就是消费以后会告知rabbitmq服务器该条消息已经处理完毕,这样可以方式消息处理一半挂掉了,结果服务器也删除了这条未处理完毕的消息 $channel->basic_consume('hello', '', false, true, false, false, [$receiver, 'callFunc']); while(true) { $channel->wait(); } $channel->close(); $connection->close(); } public function task() { $re = input('uid'); $connection = new AMQPStreamConnection('localhost', 5672, 'bitch', 'bitch'); $channel = $connection->channel(); $channel->queue_declare('hello', false, true); for($i=1; $i<11; $i++){ $msg = new AMQPMessage($i); $channel->basic_publish($msg, '', 'hello'); echo "第".$i.'发送完毕'; } $channel->close(); $connection->close(); }
4:在命令行启动三个worker
发布10条消息:
结果:
结论一: rabbitmq服务器会依次把消息分发给每个worker, 不关每个消息会执行多久
结论二: 如果其中一个worker在执行过程中挂掉了,那么分给它的消息就丢失了,这个在下面的例子解决
解决结论二现象: 其中一个消费worker挂掉以后,分发给这个worker的消息就全部丢失掉了
第一步:
第二步:
第三步实验:启动2个worker,然后强制退出第一个,就会发现本来给worker1 的消息最后重新分发给了 worker2