RabbitMQ+PHP

消息队列中的3个角色


  1. MQ:消息队列服务,负责队列消息的管理、分发和持久化等,是整个应用的核心,一般只有一个(集群只是多机,服务只有一个);
  2. clienter:负责推送队列信息,提出处理需求,可以有多个;
  3. worker:负责接收队列信息,进行实际的任务处理;

消息队列的解耦


  1. 时间解耦:即异步处理,clienter 和 worker的工作可以不在一个时间轴内;
  2. 资源解耦:clienter 和 worker 可以部署在不同的机器、ip和网络环境中,实现资源的独立分配;
  3. 应用解耦:clienter 和 worker 通常是不同的应用,甚至是不同的编程语言的应用,实现模块之间的解耦。

Linux下RabbitMQ的安装&启动

yum -y install erlang rabbitmq-server
service rabbitmq-server start
chkconfig rabbitmq-server on

增加rabbitmq_management(web的监控和管理端)

/usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin/rabbitmq-plugins enable rabbitmq_management

rabbitMQ服务监听配置

在/etc/rabbitmq 目录下新增文件:rabbitmq-env.conf

RABBITMQ_NODE_IP_ADDRESS=192.168.100.101
RABBITMQ_NODE_PORT=5672
RABBITMQ_NODENAME=rabbit

配置完成,查看端口是否正常监听

service rabbitmq-server restart
netstat -apn | grep 5672

 

PHP调用rabbitMQ服务

  1. 推荐rabbitMQ官方推荐的php扩展包:https://github.com/php-amqplib/php-amqplib
  2. pecl包:http://pecl.php.net/package/amqp

## 推荐php-amqplib进行开发,它说明和demo比较齐全,pecl-amqp只是基于amqp协议的扩展,参数和demo几乎没有,不推荐。

worker的处理方式

  1. 通过计划任务触发worker处理,适用于可延时较高的任务;
  2. 常驻处理,如果有pcntl扩展,建议通过守护进程的方式触发worker处理,提高常驻处理的稳定性

发送消息示例:

//引用所需文件
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
//建立一个连接通道,声明一个可以发送消息的队列hello
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);

//定义一个消息,消息内容为Hello World!
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello');

//发送完成后打印消息告诉发布消息的人:发送成功
echo " [x] Sent 'Hello World!'\n";
//关闭连接
$channel->close();
$connection->close();

接收消息示例:

require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$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";
};

//在接收消息的时候调用$callback函数
$channel->basic_consume('hello', '', false, true, false, false, $callback);

while(count($channel->callbacks)) {
    $channel->wait();
}

引用文章:消息队列-RabbitMq(PHP)

     官网文档地址

猜你喜欢

转载自www.cnblogs.com/xuey/p/9233951.html
今日推荐