Windows 安装 amqp 扩展

RabbitMQ 是基于 amqp(高级消息队列协议) 协议的。使用 RabbitMQ 前必须为 PHP 安装相应的 amqp 扩展。
  1. 下载相应版本的 amqp 扩展:http://pecl.php.net/package/amqp,解压缩文件。
  2. 将 php_amqp.dll 复制到 php 的扩展目录 ext 下,修改配置文件 php.ini:

    1. [amqp]
    2. extension=php_amqp.dll
  3. 将 rabbitmq.*.dll 文件复制到 php 的安装目录下,然后修改 Apache 配置文件 httpd.conf:

    1. #[rabbitmq]
    2. LoadFile "F:\wamp64\bin\php\php7.0.10\rabbitmq.*.dll"
  4. 重启服务器,查看 phpinfo,确认扩展信息。

Direct Exchange 模式

Direct Exchange 模式的交换机适合用于消息的单播发送. 交换机根据推送消息时的 routing key 和 队列的 routing key 判断消息应该推送到哪个队列. 可以实现同一交换机上的消息, 根据 routing key 推送到不同的队列中.

默认 Direct Exchange

此种模式下,使用 RabbitMQ 的默认 Exchange 即可,默认的 Exchange 是 Direct 模式。使用默认 Exchange 时,不需要对 Exchange 进行属性设置和声明,也不需要对 Queue 进行显示绑定和设置 routing key。Queue 默认会绑定到默认 Exchange,以及默认 routing key 与 Queue 的名称相同。

producer.php:
  1. 创建连接并发起连接
  2. 在连接上创建通道
  3. 在通道上获取默认交换机
  4. 向交换机发送消息
  1. header('Content-Type: text/html; charset=utf-8');
  2. // 连接设置
  3. $conConfig = [
  4.   'host' => '127.0.0.1',
  5.   'port' => 5672,
  6.   'login' => 'root',
  7.   'password' => 'root',
  8.   'vhost' => '/'
  9. ];
  10. try
  11. {
  12.   // RabbitMQ 连接实例
  13.   $con = new AMQPConnection($conConfig);
  14.   // 发起连接
  15.   $con->connect();
  16.   // 判断连接是否仍然有效
  17.   if(!$con->isConnected())
  18.   {
  19.     echo '连接失败';die;
  20.   }
  21.   // 新建通道
  22.   $channel = new AMQPChannel($con);
  23.   // 使用RabbitMQ的默认Exchange
  24.   $exchange = new AMQPExchange($channel);
  25.   for($i = 1; $i < 6; $i++)
  26.   {
  27.     $message = [
  28.       'name' => '默认交换机,消息-' . $i,
  29.       'info' => 'Hello World!'
  30.     ];
  31.     // 发送消息,为消息指定routing key,成功返回true,失败false
  32.     $state = $exchange->publish(json_encode($message, JSON_UNESCAPED_UNICODE), 'test.queue1');
  33.     if($state)
  34.     {
  35.       echo 'Success' . PHP_EOL;
  36.     }else
  37.     {
  38.       echo 'Fail' . PHP_EOL;
  39.     }
  40.   }
  41.   // 关闭连接
  42.   $con->disconnect();
  43. }catch(Exception $e)
  44. {
  45.   echo $e->getMessage();
  46. }
consumer.php:
  1. 创建连接并发起连接
  2. 在连接上创建通道
  3. 在通道上创建队列并声明队列
  4. 从队列获取消息
  1. header('Content-Type: text/html; charset=utf-8');
  2. $conConfig = [
  3.   'host' => '127.0.0.1',
  4.   'port' => 5672,
  5.   'login' => 'root',
  6.   'password' => 'root',
  7.   'vhost' => '/'
  8. ];
  9.  
  10. try
  11. {
  12.   $con = new AMQPConnection($conConfig);
  13.   $con->connect();
  14.   if(!$con->isConnected())
  15.   {
  16.     echo '连接失败';die;
  17.   }
  18.  
  19.   $channel = new AMQPChannel($con);
  20.  
  21.   $queue = new AMQPQueue($channel);
  22.   $queue->setName('test.queue1');
  23.   // 声明队列,不需要对Queue进行显示绑定到交换机和指定Queue的routing key
  24.   $queue->declareQueue();
  25.   $queue->consume(function($envelope, $queue)
  26.   {
  27.     echo $envelope->getBody() . PHP_EOL;
  28.   }, AMQP_AUTOACK);
  29.  
  30.   $con->disconnect();
  31. }catch(Exception $e)
  32. {
  33.   echo $e->getMessage();
  34. }

自定义 Direct Exchange

producer:
  1. header('Content-Type: text/html; charset=utf-8');
  2. // 连接设置
  3. $conConfig = [
  4.   'host' => '127.0.0.1',
  5.   'port' => 5672,
  6.   'login' => 'root',
  7.   'password' => 'root',
  8.   'vhost' => '/'
  9. ];
  10. try
  11. {
  12.   // RabbitMQ 连接实例
  13.   $con = new AMQPConnection($conConfig);
  14.   // 发起连接
  15.   $con->connect();
  16.   // 判断连接结果,true成功,false失败
  17.   if(!$con->isConnected())
  18.   {
  19.     echo '连接失败';die;
  20.   }
  21.   // 新建通道
  22.   $channel = new AMQPChannel($con);
  23.   // 新建交换机
  24.   $exchange = new AMQPExchange($channel);
  25.   // 交换机名称
  26.   $exchange->setName('test.direct');
  27.   // 交换机类型
  28.   $exchange->setType('direct');
  29.   // 声明交换机
  30.   $exchange->declareExchange();
  31.   for($i = 1; $i < 6; $i++)
  32.   {
  33.     $message = [
  34.       'name' => 'direct交换机,消息-' . $i,
  35.       'info' => 'Hello World!'
  36.     ];
  37.     // 发送消息,同时为消息指定routing key,成功返回true,失败false
  38.     $state = $exchange->publish(json_encode($message, JSON_UNESCAPED_UNICODE), 'test.queue1');
  39.     if($state)
  40.     {
  41.       echo 'Success' . PHP_EOL;
  42.     }else
  43.     {
  44.       echo 'Fail' . PHP_EOL;
  45.     }
  46.   }
  47.  
  48.   // 关闭连接
  49.   $con->disconnect();
  50. }catch(Exception $e)
  51. {
  52.   echo $e->getMessage();
  53. }
consumer:
  1. header('Content-Type: text/html; charset=utf-8');
  2. $conConfig = [
  3.   'host' => '127.0.0.1',
  4.   'port' => 5672,
  5.   'login' => 'root',
  6.   'password' => 'root',
  7.   'vhost' => '/'
  8. ];
  9.  
  10. try
  11. {
  12.   $con = new AMQPConnection($conConfig);
  13.   $con->connect();
  14.   if(!$con->isConnected())
  15.   {
  16.     echo '连接失败';die;
  17.   }
  18.  
  19.   $channel = new AMQPChannel($con);
  20.  
  21.   $exchange =new AMQPExchange($channel);
  22.   $exchange->setName("test.direct");
  23.   $exchange->setType('direct');
  24.   $exchange->setFlags(AMQP_DURABLE);
  25.   $exchange->declareExchange();
  26.  
  27.   $queue = new AMQPQueue($channel);
  28.   $queue->setName('test.queue1');
  29.   // 声明队列,不需要对Queue进行显示绑定到交换机和指定Queue的routing key
  30.   $queue->declareQueue();
  31.   // 绑定队列到指定交换机,并指定routing key,即分发规则,消息的routing key与队列的绑定routing key匹配时才
  32.   $queue->bind('test.direct', 'test.queue1');
  33.   $queue->consume(function($envelope, $queue)
  34.   {
  35.     echo $envelope->getBody() . PHP_EOL;
  36.   }, AMQP_AUTOACK);
  37.  
  38.   $con->disconnect();
  39. }catch(Exception $e)
  40. {
  41.   echo $e->getMessage();
  42. }

PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (一) -- 安装 AMQP 扩展和 Direct Exchange 模式的更多相关文章

  1. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (四) -- Push API 和 Pull API

    RabbitMQ 中针对消息的分发提供了 Push API (订阅模式) 和 Pull API (主动获取) 两种模式. 在 PHP 中, 这两种模式分别通过 AMQPQueue 类中的 consum ...

  2. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (三) -- Header Exchange

    此模式下,消息的routing key 和队列的 routing key 会被完全忽略,而是在交换机推送消息和队列绑定交换机时, 分别为消息和队列设置 headers 属性, 通过匹配消息和队列的 h ...

  3. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (二) -- Topic Exchange 和 Fanout Exchange

    Topic Exchange 此模式下交换机,在推送消息时, 会根据消息的主题词和队列的主题词决定将消息推送到哪个队列. 交换机只会为 Queue 分发符合其指定的主题的消息. 向交换机发送消息时,消 ...

  4. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (五) -- 自动 ACK、手动 ACK、NACK

    以 Direct 类型的 交换机和 Queue 的 get 方法为例. producer.php // 连接设置 $conConfig = [ 'host' => '127.0.0.1', 'p ...

  5. RabbitMQ简单介绍+Windows环境安装

    文章目录 1.RabbitMQ简介2.RabbitMQ与其他MQ有什么不同3.RabbitMQ环境安装3.1 安装erlang3.2 安装rabbitmq-server4. RabbitMQ管理平台介 ...

  6. gtk+3.0的环境配置及基于gtk+3.0的python简单样例

    /*********************************************************************  * Author  : Samson  * Date   ...

  7. AMQP消息队列之RabbitMQ简单示例

    前面一篇文章讲了如何快速搭建一个ActiveMQ的示例程序,ActiveMQ是JMS的实现,那这篇文章就再看下另外一种消息队列AMQP的代表实现RabbitMQ的简单示例吧.在具体讲解之前,先通过一个 ...

  8. Linux下,如何给PHP安装pdo_mysql扩展

    下载了一个免费开源的广告系统(openadserver),在Linux上安装时,提示要安装 pdo_mysql 扩展,先前有过编译安装 soap扩展 的经历,今天要编译安装 pdo_mysql 扩展, ...

  9. RabbitMQ基础知识及Linux安装

    RabbitMQ: RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现. AMQP协议: AMQP,即Advanced Message Qu ...

随机推荐

  1. hdu 1284

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. Python科学计算工具包

    import numpy as np # 创建一个Ndarray # 1. 从list对象中创建 # 2. 创建一个特定的数组,全1数组ones,随机数组random.randn,对角矩阵diag # ...

  3. EA使用记录

    1.Del键只能删除桌面上的图形,不能删除项目树中的图形:要同时从项目树中删除需要ctrl + del: 2.要找到桌面上的图形对应的项目树中的图 alt + g: 3.要设置默认的LINK样式,在菜 ...

  4. 【插件开发】—— 12 GEF入门

    介绍 前面也简单的介绍了一下插件开发的相关知识,下面主要就介绍一下GEF的相关使用.由于最近使用到编辑器这部分的操作,因此就跳过其他的内容,先介绍下GEF的相关知识. 前文回顾 1 插件学习篇 2 简 ...

  5. 利用OneDNS同步chrome数据

    将DNS服务器改成OneDNS的 117.50.11.11 备用改为 117.50.22.22 然后刷新自己的DNS缓存,接着测试一下https://test.onedns.net即可 这样既可以正常 ...

  6. java启动参数一

    java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...

  7. [Usaco2008 Dec]Patting Heads 轻拍牛头

    Description 今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏. 贝茜让N(1≤N≤100000)头奶牛坐成一个圈.除了1号与N号奶牛外,i号奶牛与i-l号和i+l号奶牛相邻.N号 ...

  8. LightOj 1220 Mysterious Bacteria

    题目大意: 给出一个x,求满足x = b^p,p最大是多少? 解题思路: x可以表示为:x = p1^e1 * p2^e2 * p3^e3 ....... * pn^en. p = gcd (e1,e ...

  9. 关于c头文件的使用的小记录

    在用visual studio实现数据结构上的一些结构与算法的时候,想在一个工程中建立几个文件,然后主文件可以使用其他文件的函数与变量(比如定义的结构体还有数据结构接口函数).  我们可以利用头文件来 ...

  10. 配置Oracle监听器

    Oracle的监听和网络服务都可以在Net Manager中配置,如下图.也可以在上面的那个Net Configuration Assistant中配置,只是Net Manager比较方便些. Ora ...