安装

Mac 用户推荐使用 HomeBrew 来安装:

brew install rabbitmq

安装过程中会自动其所依赖的 Erlang 。

启动

RabbitMQ server scripts 和 CLI tools

被安装在/usr/local/sbin

添加环境变量:

export PATH=$PATH:/usr/local/sbin

启动:

rabbitmq-server

如下图则表示正常启动,completed with 6 plugins 表示启动的时候默认加载了6个插件:

正常启动

日志:

/var/log/rabbitmq目录下找到名为rabbit@[hostname].log日志文件

常用命令:

首先介绍两个概念,Erlang的节点和应用程序:节点可以理解为Erlang 的虚拟机,一个节点可以同时运行多个应用程序。节点之间可以进行本地通信(不管他们是不是运行在同一台服务器之上)。比如一个运行在节点A上的应用程序可以调用节点B上应用程序的方法,就好像调用本地函数一样。如果应用程序由于某些原因奔溃,Erlang 节点会自动尝试重启应用程序。

//守护进程方式后台运行

rabbitmq-server -detached

//查询服务器状态

rabbitmqctl status

//关闭 RabbitMQ 节点,默认 node 名称是 rabbit@server

rabbitmqctl stop

//关闭指定node

rabbitmqctl -n rabbit@server.example.com stop

//关闭 RabbitMQ 应用程序,保持Erlang节点运行(这个命令在集群模式中将会很有用)

rabbitmqctl stop_app

//启动 RabbitMQ 应用程序

rabbitmqctl start_app

//重置 RabbitMQ 节点(该命令会清除所有的队列):

rabbitmqctl reset

//查看已声明的队列

rabbitmqctl list_queues

//查看交换器

rabbitmqctl list_exchanges

//该命令还可以附加参数,比如列出交换器的名称、类型、是否持久化、是否自动删除:

rabbitmqctl list_exchanges name type durable auto_delete

//查看绑定

rabbitmqctl list_bindings

PHP Client

{

"require": {

"php-amqplib/php-amqplib": ">=2.6.1"

}

}

send.php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;

use PhpAmqpLib\Message\AMQPMessage;

//create a connection to the server

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');

$channel = $connection->channel();

//declare a queue for us to send to

$channel->queue_declare('hello', false, false, false, false);

//publish a message to the queue

$msg = new AMQPMessage('Hello World!');

$channel->basic_publish($msg, '', 'hello');

echo " [x] Sent 'Hello World!'\n";

//close the channel and the connection;

$channel->close();

$connection->close();

发送消息前,必须先声明一个队列。值得注意的是,这里的队列声明是幂等的,即只有才队列不存在的情况才会去创建。消息的主体是一个二进制数组(byte array),因此我们可以自己随意选择编码方式,而不影响传输。

receive.php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');

$channel = $connection->channel();

//Note that we declare the queue here, as well. Because we might start the consumer before the publisher, we want to make sure the queue exists before we try to consume messages from it.

$channel->queue_declare('hello', false, false, false, false);

echo " [*] Waiting for messages. To exit press CTRL+C\n";

$callback = function ($msg) {

echo ' [x] Received ', $msg->body, "\n";

};

$channel->basic_consume('hello', '', false, true, false, false, $callback);

while (count($channel->callbacks)) {

$channel->wait();

}

注意:这里接受消息我们也要先声明队列,因为实际应用中我们可能需要producer发送前先启动worker,所以我们要确保在我们消费消息之前队列存在。

consumer获取消息的方式是MQ按照push的方式分发给worker的,如果我们启动多个worker,那么我们就会发现每次我们推给mq的消息会被依次分发给各个worker消费。

4.消息确认(Message Acknowledgement)

rabbitmq的消息确认机制默认是被关闭的。如果我们在worker处理消息过程中杀死worker,那么worker重启之后,这条任务就会丢失。如果要确保任务不会丢失,就要使用以下代码:

$callback = function ($msg) {

echo ' [x] Received ', $msg->body, "\n";

//ack回调

$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);

};

$channel->basic_consume('task_queue', '', false, false, false, false, $callback);

增加以上ack机制后,mq只有在收到确认之后才会将任务从队列中删除。

消息持久化(Message durability)

上面介绍的是如何在consumer崩溃的时候,task不丢失。但是当rabbitmq崩溃的时候queue和task仍然会丢失,很明显这是我们不能接受的,下面的代码就是如何让我们的queue和task持久化:

//声明持久化的队列

$channel->queue_declare('task_queue', false, true, false, false); //第三个参数为true

//消息持久化存储在队列中

$msg = new AMQPMessage(

$data,

array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT)

);

启用php client,RabbitMQ(二):安装 和 PHP Client相关推荐

  1. RabbitMq(二) Connection、Channels、Exchanges、Queues 等基本概念介绍

    一.Connection .Channel.Queue等之间关系 在Mq中connection以及Channel Exchange Queue 是什么样的关系,我们可以从下图可以可以进行了解,图片来自 ...

  2. RabbitMQ liunx-centos 安装过程记录

    为什么80%的码农都做不了架构师?>>>    主要是根据官网指南安装的,地址http://www.rabbitmq.com/install-rpm.html 安装 一.安装Erla ...

  3. Linux下 RabbitMQ的安装与配置

    一  Erlang安装 RabbitMQ是基于Erlang的,所以首先必须配置Erlang环境. 从Erlang的官网 http://www.erlang.org/download.html 下载最新 ...

  4. MQ消息队列之RabbitMQ的安装和原理

    1. RabbitMQ安装 1.1 推荐方法:docker安装 一行命令搞定: docker pull rabbitmq:management 开启宿主机与容器的两个重要的端口映射即可: docker ...

  5. RabbitMQ 的安装----windows环境

    一.RabbitMQ在windows下的安装 RabbitMQ 它依赖于Erlang,在window上安装时,需要先安装Erlang. 首先确定你的window电脑是32位还是64位,然后下载对应版本 ...

  6. RabbitMQ快速安装配置指南

    RabbitMQ快速安装配置指南 官网的安装教程由于需要解释原理很多废话,这里总结一下在CentOS7环境下的安装配置过程.如需理解原理,请看官网原文的安装指南或翻译 1. 安装RabbitMQ se ...

  7. erlang安装_RabbitMQ的使用(一)- RabbitMQ服务安装

    作者:markjiang7m2博客园地址:https://www.cnblogs.com/markjiang7m2/p/12769627.html官网地址:http://letyouknow.net ...

  8. (RabbitMQ 二)Springboot项目中使用RabbitMQ的相关依赖

    (RabbitMQ 二)Springboot项目中使用RabbitMQ的相关依赖 RabbitMQ系列文章如下: (RabbitMQ 一[转载])windows10环境下的RabbitMQ安装步骤 h ...

  9. RabbitMQ基础知识介绍、RabbitMQ的安装

    RabbitMQ基础知识介绍 官方解释:MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过                   读写出入队列的消息 ...

  10. oracle客户端没有tnsnames,安装好Oracle Client以后没有tnsnames.ora文件

    安装好Oracle Client以后没有tnsnames.ora文件 安装完Oracle Client以后,发现相应目录中没有tnsnames.ora文件,其实只要手动建立一个就可以了. 在 orac ...

最新文章

  1. Copy复制命令兼容各种浏览器(等同于触发Ctrl+C或者Command⌘+C)
  2. cs python课程 加州大学_B站的CS课程整理 搬运
  3. javascript开发技巧训练_学好这些小技巧,帮你写出更好地JavaScript
  4. jdbc连接sqlserver报错java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver...
  5. IDEA 2020.3.2控制台中文乱码分享(亲测二、下图中控制台的编码改为UTF-8)
  6. 搭建elsticsearch集群 报错 failed to send join request to master [{data-node-0}(已经测试)
  7. canvas-star7.html
  8. android 键盘回车按钮事件,android 监听软键盘 回车键
  9. csv 中 数值被自动转换成科学计数法 的问题 excel打开后数字用科学计数法显示且低位变0的解决方法
  10. 计算机怎么查看网络连接,怎么查看自己的
  11. 关于传奇MapInfo地图文件参数详细说明
  12. win10 Delphi7 Help帮助文档的安装
  13. 游程编码用matlab实现代码_二值图像游程编码算法的Matlab实现 -
  14. 如何评价杭州阿里、海康、网易等组成 HR 联盟?
  15. mac外接键盘HOME,END键问题
  16. 刀片服务器改台式电脑_刀片服务器安装指南_IT /计算机_信息
  17. (以Windows 7 引导的)Windows 和Ubuntu双系统安装
  18. 华为WLAN射频资源管理
  19. 鸿蒙系统遇强劲对手,鸿蒙迎强劲对手,三星Tizen系统装机量突破1.6亿,份额已斩获第一...
  20. 机械自动化原理动图,你都见过吗?

热门文章

  1. 笔记本手机都能用的充电器,做的只有乒乓球大小,AOHi 65W氮化镓充电器体验
  2. 基于双语数据集搭建seq2seq模型
  3. 【LeetCode】460 and 1132(LFU缓存机制)
  4. oracle 自增数,ORACLE自增函数,一般函数
  5. MT6737芯片功能介绍+MT6737芯片资料分享
  6. 计算机网络 路由选择,路由选择
  7. python找零_python 找零问题 动态规划
  8. 电话号码归属地批量查询方法的优缺点对比
  9. 工业级氯化锂2022年全球行业分析报告
  10. mysql数据库添加商品_如何检测mysql 数据库执行了哪些sql语句 ecshop如何添加商品属性 ecshop 商品属性批量采集入库...