提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
在安装好rabbitmq之后,并且php扩展amqp的已经安装完成之后,开始的步骤.
找项目位置,或者新建一个文件夹,执行以下代码:
composer require php-amqplib/php-amqplib
代码如下(示例):
require_once(__DIR__ . './vendor/autoload.php');
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$conf = [
'host' => '127.0.0.1',
'port' => '5672',
'user' => 'guest',
'pwd' => 'guest',
'vhost'=> '/'
];
$exchange_name = 'send_ex';//交换机名
$queue_name = 'send_q'; //队列名
$routing_key = 'sms_send';//路由关键字
$conn = new AMQPStreamConnection(
//建立生产者与mq之间的关系
$conf['host'],$conf['port'],$conf['user'],$conf['pwd'],$conf['vhost']
);
$channel = $conn->channel();//在已连接的基础上建立生产者与mq之间的通道
$channel->exchange_declare($exchange_name,'direct',false,true,false); //初始化交换机
$channel->queue_declare($queue_name,false,true,false,false); //初始化队列
$channel->queue_bind($queue_name,$exchange_name,$routing_key); //将队列与每个交换机记性绑定,并使用路由关键字
$msg_body = json_encode(['name'=>'igoo','age'=>22]);
$msg = new AMQPMessage($msg_body, ['content_type'=>'text/plain','delivery_mode'=>2]); //生成消息
$r = $channel->basic_publish($msg,$exchange_name,$routing_key); //推送消息到某个交换机
$channel->close();
$conn->close();
require_once(__DIR__ . './vendor/autoload.php');
use PhpAmqpLib\Connection\AMQPStreamConnection;
$conf = [
'host' => '127.0.0.1',
'port' => '5672',
'user' => 'guest',
'pwd' => 'guest',
'vhost'=> '/'
];
$exchange_name = 'send_ex';//交换机名
$queue_name = 'send_q'; //队列名
$routing_key = 'sms_send';//路由关键字
$conn = new AMQPStreamConnection(
//建立生产者与mq之间的关系
$conf['host'],$conf['port'],$conf['user'],$conf['pwd'],$conf['vhost']
);
$channel = $conn->channel();//在已连接的基础上建立生产者与mq之间的通道
$channel->exchange_declare($exchange_name,'direct',false,true,false); //初始化交换机
$channel->queue_declare($queue_name,false,true,false,false); //初始化队列
$channel->queue_bind($queue_name,$exchange_name,$routing_key); //将队列与每个交换机记性绑定,并使用路由关键字
echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";
$callback = function($msg){
echo " [x] Received ",$msg->body,"\n";
};
$channel->basic_consume($queue_name, 'consumer1',false,true,false,false, $callback);
while(count($channel->callbacks)) {
$channel->wait();
}
$channel->close();
$connection->close();
以上代码都是在网络上可以搜到的,并且我是真实执行测试过,很多参数都是第一次见不认识的,没关系我都做了记录,先看执行结果,如下:
1.执行生产者代码
2.执行消费者代码
1.exchange_declare($exchangeName, ‘direct’, false, true, false); //声明初始化交换机
参数位置 | 参数说明 |
---|---|
1.$exchangeName | 交换机名称 |
2 | 推送类型:direct 精准推送fanout 广播.推送到绑定到此交换机下的所有队列.topic 组播. |
3.passive | 是否检测同名交换机,消极处理判断是否存在交换机相同的名称 |
4.durable | 是否开启持久化 |
5.auto_delete | 通道关闭后是否删除 |
2.queue_declare($queueName, false, true, false, false); //声明初始化一条队列
参数位置 | 参数说明 |
---|---|
1.$queueName, | 队列名称 |
2.passive | 是否检测同名队列,消极处理,判断是否存在队列 |
3.durable | 是否开启队列持久化 |
4 .exclusive | 队列是否可以被其他队列访问,是否为当前连接的专用队列,在连接断开后,会自动删除该队列 |
5.auto_delete | 通道关闭后是否删除队列 |
3.queue_bind( q u e u e n a m e , queue_name, queuename,exchange_name,$routing_key)//将队列与每个交换机记性绑定,并使用路由关键字
参数位置 | 参数说明 |
---|---|
1.$queue_name | 队列名 |
2.$exchange_name | 交换机名 |
3.$routing_key) | 路由键名 |
4.new AMQPMessage( d a t a , data, data,properties)//生成消息
参数位置 | 参数说明 |
---|---|
1.$data string类型 | 要发送的消息 |
2.$properties array类型 | 设置的属性,比如设置该消息持久化[‘delivery_mode’=>2] |
5.basic_publish( m s g , msg, msg,exchange_name,$routing_key)//推送消息到某个交换机
参数位置 | 参数说明 |
---|---|
1.$msg | 消息 |
2.$exchange_name | . 交换机名 |
3.$routing_key | 路由键名 |
6.basic_consume(‘mq_sms_send_q’, ‘consumer1’, false, false, false, false, $callback)
参数位置 | 参数说明 |
---|---|
1 | 队列名 |
2.consumer_tag | 消费者标签 |
3.no_local | 不接收此使用者发布的消息, false这个功能属于AMQP的标准,但是rabbitMQ并没有做实现.参考 |
4.no_ack | 使用者是否使用自动确认模式,:收到消息后,是否不需要回复确认即被认为被消费;设置为true,表示自动应答;设置为false表示手动应答。 |
5.exclusive | 请求独占使用者访问,exclusive false排他消费者,即这个队列只能由一个消费者消费.适用于任务不允许进行并发处理的情况下.比如系统对接 |
6.nowait | 不等待,false不返回执行结果,但是如果排他开启的话,则必须需要等待结果的,如果两个一起开就会报错 |
7 | 消息回调函数 |
7.$channel->basic_qos(null, 1, null); //处理和确认完消息后再消费新的消息
参数位置 | 参数说明 |
---|---|
1 | prefetchSize:0 |
2 | prefetchCount:会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该consumer将block掉,直到有消息ack |
3 | global:true\false 是否将上面设置应用于channel,简单点说,就是上面限制是channel级别的还是consumer级别 |
未完待续