PHP rabbitmq helloworld

57 阅读1分钟

image.png

发送数据.php

```
<?php

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

require_once __DIR__ . '/vendor/autoload.php';

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();


$channel->queue_declare('hello',
    false,
    false,
    false,
    false);

$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello');

echo " [x] Sent 'Hello World!'\n";


$channel->close();
$connection->close();
```

消费.php

```
<?php
require_once __DIR__ .'/vendor/autoload.php';


$connection = new \PhpAmqpLib\Connection\AMQPStreamConnection("localhost",
    5672,
    'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare("hello",
    false,
    false,
    false,
    false
);

$callback=function ($msg){
    echo "有消息了==>".$msg->body.'<br/>';
};
$channel->basic_consume('hello',
    '',
    false,
    true,
    false,
    false, $callback);


echo "消息监听中";
while(count($channel->callbacks)){
    $channel->wait();
}
```

队列构造的参数说明

定义队列 $cachannel->quenne(


'队列名称',
// 如果队列不存在是否新增一个队列 如果是false 就是会新增,true就是如果存在会直接报,不新增,
passive 默认false
// 是否持久化,默认false , 如果true那么重启服务器 队列消失
durable,
//是否排他  默认false,那么第一次连接才可以连接到,除非断开,要不然不给其他人连接
exclusive,
//是否自动删除,默认false,开始有一个连接之后,所有的连接失效之后,删除队列
auto_delete,
//参数 x-message-ttl,之类
arguments

)


测试 passive true 没有这个队列连接 直接报错

image.png

image.png false 启动正常 查看新增了队列hello

image.png


测试durable false 重启消息服务,发现队列消失了

image.png

image.png

测试 durable true的时候,检查多了一个[D]的数据,之后重启服务器,队列存在

image.png


exclusive 设置TRUE 开始排他 启动发送脚本直接报错

PHP Fatal error:  Uncaught PhpAmqpLib\Exception\AMQPProtocolChannelException: RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'hello' in vhost '/'. It could be originally declared on another connection or the exclusive property value does not match that of the original declaration.

提示排他了 没法连接上!!!!

测试auto_delete 设置为true,不知道如何测试!!!!

消费者的基本消费方法 base_conume

```
$channel->basic_consume('hello',
    '',
    false,
    true,
    false,
    false, $callback);
```

queue 指定消费那个队列的数据
consumer_tag: 默认会生成一个uuid
no_local 网络无说明
no_ack 消息是否需要应答,comsumer需要手动告诉队列我消费了,
no_ack true 消息自定应答,只要消费者接受到消息 自己就应答了
exclusive 排他消费者,表示队列只您呢个一个消费者处理,适合任务不允许高并发的场景
nowait


no_ack true 测试,发送一条数据,立即就被消费掉了 no_ack false 发送数据,消费者的回调都接受到消息了,但是【untack】有数量, 这些就是没有被确认的数据,需要收到确认,在回调里面加入下面语句,作用就是确保在处理业务之后,通知队列消息消费完成,这个时候untack为0,表示消息手动消费完成

```
//手动ack应答
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
```

image.png

测试exclusive true,复制多一份消费者,运行第一个消费者之后,启动第二个消费者 image.png

提示,表示这个队列不能给第二个消费者消费

PHP Fatal error:  Uncaught PhpAmqpLib\Exception\AMQPProtocolChannelException: ACCESS_REFUSED - queue 'hello' in vhost '/' in exclusive use in E:\phpstudy_pro\WWW\tp1\vendor\php-amqplib\php-amqplib\PhpAmqpLib\Channel\AMQPChannel.php:188
Stack trace: