发送数据.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 没有这个队列连接 直接报错
false 启动正常 查看新增了队列hello
测试durable false 重启消息服务,发现队列消失了
测试 durable true的时候,检查多了一个[D]的数据,之后重启服务器,队列存在
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']);
```
测试exclusive true,复制多一份消费者,运行第一个消费者之后,启动第二个消费者
提示,表示这个队列不能给第二个消费者消费
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: