RabbitMQ-PHP代码实现

RabbitMQ-PHP代码实现

  • 前言
  • 一、说明
  • 二、开始
    • 1.引入库
    • 2.生产者代码(发送消息端)
    • 3.消费者代码(接受消息端)
    • 4.函数解读
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、说明

在安装好rabbitmq之后,并且php扩展amqp的已经安装完成之后,开始的步骤.

二、开始

1.引入库

找项目位置,或者新建一个文件夹,执行以下代码:

composer require php-amqplib/php-amqplib

执行成功后:会有该文件夹,可直接在该文件夹下写测试代码.
RabbitMQ-PHP代码实现_第1张图片

2.生产者代码(发送消息端)

代码如下(示例):


	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();

3.消费者代码(接受消息端)


	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.执行生产者代码
RabbitMQ-PHP代码实现_第2张图片2.执行消费者代码
RabbitMQ-PHP代码实现_第3张图片

4.函数解读

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级别

总结

未完待续

你可能感兴趣的:(RabbitMQ,php,php)