Windows 安装 amqp 扩展

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

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

    #[rabbitmq]
    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. 向交换机发送消息
 header('Content-Type: text/html; charset=utf-8');
// 连接设置
$conConfig = [
  'host' => '127.0.0.1',
  'port' => 5672,
  'login' => 'root',
  'password' => 'root',
  'vhost' => '/'
];
try
{
  // RabbitMQ 连接实例
  $con = new AMQPConnection($conConfig);
  // 发起连接
  $con->connect();
  // 判断连接是否仍然有效
  if(!$con->isConnected())
  {
    echo '连接失败';die;
  }
  // 新建通道
  $channel = new AMQPChannel($con);
  // 使用RabbitMQ的默认Exchange
  $exchange = new AMQPExchange($channel);
  for($i = 1; $i < 6; $i++)
  {
    $message = [
      'name' => '默认交换机,消息-' . $i,
      'info' => 'Hello World!'
    ];
    // 发送消息,为消息指定routing key,成功返回true,失败false
    $state = $exchange->publish(json_encode($message, JSON_UNESCAPED_UNICODE), 'test.queue1');
    if($state)
    {
      echo 'Success' . PHP_EOL;
    }else
    {
      echo 'Fail' . PHP_EOL;
    }
  }
  // 关闭连接
  $con->disconnect();
}catch(Exception $e)
{
  echo $e->getMessage();
}
consumer.php:
  1. 创建连接并发起连接
  2. 在连接上创建通道
  3. 在通道上创建队列并声明队列
  4. 从队列获取消息
 header('Content-Type: text/html; charset=utf-8');
$conConfig = [
  'host' => '127.0.0.1',
  'port' => 5672,
  'login' => 'root',
  'password' => 'root',
  'vhost' => '/'
]; try
{
  $con = new AMQPConnection($conConfig);
  $con->connect();
  if(!$con->isConnected())
  {
    echo '连接失败';die;
  }   $channel = new AMQPChannel($con);   $queue = new AMQPQueue($channel);
  $queue->setName('test.queue1');
  // 声明队列,不需要对Queue进行显示绑定到交换机和指定Queue的routing key
  $queue->declareQueue();
  $queue->consume(function($envelope, $queue)
  {
    echo $envelope->getBody() . PHP_EOL;
  }, AMQP_AUTOACK);   $con->disconnect();
}catch(Exception $e)
{
  echo $e->getMessage();
}

自定义 Direct Exchange

producer:
header('Content-Type: text/html; charset=utf-8');
// 连接设置
$conConfig = [
  'host' => '127.0.0.1',
  'port' => 5672,
  'login' => 'root',
  'password' => 'root',
  'vhost' => '/'
];
try
{
  // RabbitMQ 连接实例
  $con = new AMQPConnection($conConfig);
  // 发起连接
  $con->connect();
  // 判断连接结果,true成功,false失败
  if(!$con->isConnected())
  {
    echo '连接失败';die;
  }
  // 新建通道
  $channel = new AMQPChannel($con);
  // 新建交换机
  $exchange = new AMQPExchange($channel);
  // 交换机名称
  $exchange->setName('test.direct');
  // 交换机类型
  $exchange->setType('direct');
  // 声明交换机
  $exchange->declareExchange();
  for($i = 1; $i < 6; $i++)
  {
    $message = [
      'name' => 'direct交换机,消息-' . $i,
      'info' => 'Hello World!'
    ];
    // 发送消息,同时为消息指定routing key,成功返回true,失败false
    $state = $exchange->publish(json_encode($message, JSON_UNESCAPED_UNICODE), 'test.queue1');
    if($state)
    {
      echo 'Success' . PHP_EOL;
    }else
    {
      echo 'Fail' . PHP_EOL;
    }
  }   // 关闭连接
  $con->disconnect();
}catch(Exception $e)
{
  echo $e->getMessage();
}
consumer:
 header('Content-Type: text/html; charset=utf-8');
$conConfig = [
  'host' => '127.0.0.1',
  'port' => 5672,
  'login' => 'root',
  'password' => 'root',
  'vhost' => '/'
]; try
{
  $con = new AMQPConnection($conConfig);
  $con->connect();
  if(!$con->isConnected())
  {
    echo '连接失败';die;
  }   $channel = new AMQPChannel($con);   $exchange =new AMQPExchange($channel);
  $exchange->setName("test.direct");
  $exchange->setType('direct');
  $exchange->setFlags(AMQP_DURABLE);
  $exchange->declareExchange();   $queue = new AMQPQueue($channel);
  $queue->setName('test.queue1');
  // 声明队列,不需要对Queue进行显示绑定到交换机和指定Queue的routing key
  $queue->declareQueue();
  // 绑定队列到指定交换机,并指定routing key,即分发规则,消息的routing key与队列的绑定routing key匹配时才
  $queue->bind('test.direct', 'test.queue1');
  $queue->consume(function($envelope, $queue)
  {
    echo $envelope->getBody() . PHP_EOL;
  }, AMQP_AUTOACK);   $con->disconnect();
}catch(Exception $e)
{
  echo $e->getMessage();
}

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. ThreadLocal工具类的使用(隔离思想)

    ThreadLocal不是用来解决共享对象的多线程访问问题的, 通过ThreadLocal的set()方法设置到线程的ThreadLocal.ThreadLocalMap里的是是线程自己要存储的对象, ...

  2. BZOJ_2844_albus就是要第一个出场_线性基

    BZOJ_2844_albus就是要第一个出场_线性基 Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S ...

  3. 分布式缓存一致性hash算法

    当服务器不多,并且不考虑扩容的时候,可直接使用简单的路由算法,用服务器数除缓存数据KEY的hash值,余数作为服务器下标即可. 但是当业务发展,网站缓存服务需要扩容时就会出现问题,比如3台缓存服务器要 ...

  4. Mysql数据库的数据类型、索引、锁、事务和视图

    Mysql数据库的数据类型.索引.锁.事务和视图 数据的类型 1)数据类型: 数据长什么样? 数据需要多少空间来存放? 系统内置数据类型和用户定义数据类型 2)MySql 支持多种列类型: 数值类型 ...

  5. 我使用过的Linux命令之hexdump - ”十六“进制查看器(转载)

    转载:http://codingstandards.iteye.com/blog/805778 本文链接:http://codingstandards.iteye.com/blog/805778   ...

  6. 解决Linux与Windows压缩解压中文文件名乱码(转载)

    转自:http://crazyfeng.com/linux-windows-compress-chinese-filename.html 由于Linux与Windows编码问题,使用Zip Tar 压 ...

  7. maven配置文件注意事项

    1:安装完成后在C:\Users\Administrator\.m2有一个文件settings.xml需要修改一下配置 2:设置maven从网上下载的jar包.(时间长会很大).我设置它保存我的电脑位 ...

  8. [POJ1721]Cards

    Description 剀剀和凡凡有N张牌(依次标号为1,2,--,N)和一台洗牌机.假设N是奇数.洗牌机的功能是进行如下的操作:对所有位置I(1≤I≤N),如果位置I上的牌是J,而且位置J上的牌是K ...

  9. 贪心 Codeforces Round #173 (Div. 2) B. Painting Eggs

    题目传送门 /* 题意:给出一种方案使得abs (A - G) <= 500,否则输出-1 贪心:每次选取使他们相差最小的,然而并没有-1:) */ #include <cstdio> ...

  10. 积分图像 分类: 图像处理 Matlab 2015-06-06 10:30 149人阅读 评论(0) 收藏

    积分图像(integral image)是一种快速计算矩形区域之和的数据结构,常利用它对算法进行加速.积分图像中处的值是原始灰度图像的左上角与当前点所围成的矩形区域内所有像素点的灰度值之和,即: 其中 ...