zoukankan      html  css  js  c++  java
  • 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 PhpAmqpLibConnectionAMQPStreamConnection;
    use PhpAmqpLibMessageAMQPMessage;
    //建立一个连接通道,声明一个可以发送消息的队列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!'
    ";
    //关闭连接
    $channel->close();
    $connection->close();

    接收消息示例:

    require_once __DIR__ . '/vendor/autoload.php';
    use PhpAmqpLibConnectionAMQPStreamConnection;
    $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', "
    ";
    $callback = function($msg) {
      echo " [x] Received ", $msg->body, "
    ";
    };
    
    //在接收消息的时候调用$callback函数
    $channel->basic_consume('hello', '', false, true, false, false, $callback);
    
    while(count($channel->callbacks)) {
        $channel->wait();
    }

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

         官网文档地址

  • 相关阅读:
    linux安装lamp/lamp/lanmp
    git命令
    redis常问面试题
    liunx 项目发布(django + uwsgi + nginx+supervisor发布web服务器)
    安装nginx
    liunx安装mysql(mariadb)
    linux安装python3
    scrapy框架day01
    网络编程, socket用法
    面向对象进阶
  • 原文地址:https://www.cnblogs.com/xuey/p/9233951.html
Copyright © 2011-2022 走看看