php操作RabbitMQ消息队列

  • 使用之前:使用rabbitmq,前提肯定需要安装erlang以及rabbitmq;

  • php使用rabbitmq需要安装客户端,下载 http://pecl.php.net/package/amqp/1.9.4/windows

  • 找到使用自已的版本,然后的php版本的rabbitmq客户端,放置在php根目录的ext文件,rabbitmq.4.dll则放置
    在,php的根目录;

  • Queue
    指具体某一个队列

  • RouteKey
    路由和交换机在进行绑定时,定义一个路由名

  • Exchange
    交换机,用于把生产者的消息根据不同工作方式分发到不同队列中.

  • Publish
    消息发送者

  • Consume
    消息接收者

  • Message
    消息本身

六种工作模式
简单模式:一个生产者,一个消费者
work模式:一个生产者,多个消费者,每个消费者获取到的消息唯一。
订阅模式:一个生产者发送的消息会被多个消费者获取。
路由模式:发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时需要指定路由key
topic模式:将路由键和某模式进行匹配,此时队列需要绑定在一个模式上,“#”匹配一个词或多个词,“*”只匹配一个词。
生产者
$exchangeName = 'product_exchange'; //交换器名称
$queueName = 'createProduct';   //队列名称
$routeKey = 'self_define_routing_key';  //RouteKey
try {
    $conn_args = array('host' => 'localhost', 'port' => '5672','vhost'=>'/', 'login' => 'guest', 'password' => 'guest');
    $conn = new AMQPConnection($conn_args);//连接mq
    $conn->connect();
    //通过mq连接创建通道
    $channel = new AMQPChannel($conn);
    //通过信道创建交换机对象
    $exchange = new AMQPExchange($channel);
    //设置交换器名称
    $exchange->setName($exchangeName);
    //设置交换机类型
    $exchange->setType(AMQP_EX_TYPE_DIRECT);
    //声明交换机
    $exchange->declareExchange();
    $data = ['id', 'name'=>"测试数据"];
    $data = json_encode($data);
    //发布消息
    $exchange->publish($data,$routeKey);
}catch (\Exception  $exception) {
    exit($exception->getMessage());
}
消费者
$exchangeName = 'product_exchange'; //交换器名称
$queueName = 'createProduct';   //队列名称
$routeKey = 'self_define_routing_key';  //RouteKey

$conn_args = array('host' => 'localhost', 'vhost' => '/', 'port' => '5672', 'login' => 'guest', 'password' => 'guest');
$conn = new AMQPConnection($conn_args);//连接mq
$conn->connect();
// 通过mq连接创建信道
$channel = new AMQPChannel($conn);
// 通过信道创建交换器对象
$exchange = new AMQPExchange($channel);
// 设置交换器名称
$exchange->setName($exchangeName);
// 声明自己监听哪个队列
$queue = new AMQPQueue($channel);
$queue->setName($queueName);
$queue->declareQueue();
//绑定监听
$queue->bind($exchangeName,$routeKey);
$queue->consume(function ($envelope, $queue) {
    $data = $envelope->getBody();
    //回应
    var_dump($data);
    $queue->ack($envelope->getDeliveryTag());
});//阻塞监听
  • 命令行先执行消费者,在执行生产者;
posted @ 2021-03-29 09:18  惊风破浪的博客  阅读(538)  评论(0编辑  收藏  举报