PHP與RabbitMQ(上)


一、下載

1.下載Erlang環境

https://www.erlang.org/downloads

2.下載Rabbitmq-server

https://www.rabbitmq.com/install-windows.html

 

 

二、安裝

先安裝Erlang,再安裝rabbitmq-server,一直下一步即可。安裝完之后使用cmd進入RabbitMQ Server文件下的sbin目錄,執行:

rabbitmq-plugins enable rabbitmq_management

打開瀏覽器,輸入localhost:15672,出現如下界面則安裝成功。

默認賬號:guest

默認密碼:guest

我們創建個admin管理員賬號:

admin管理員登錄創建個test_host

 

三、Hello World

這里我以Yii框架為例介紹如何使用RabbitMQ,需要使用composer下載php-amqplib

composer require php-amqplib/php-amqplib

 

生產者:

<?php

namespace app\commands;

use yii\console\Controller;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Connection\AMQPStreamConnection;

class ProductController extends Controller
{
    public function actionIndex()
    {
        $conn = new AMQPStreamConnection('localhost', 5672, 'admin', 'admin', 'test_host');
        $channel = $conn->channel();

        $msgBody = 'Hello White Rabbit!';

        $msg = new AMQPMessage($msgBody, ['content_type' => 'text/plain', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
        //聲明一個隊列,所有的參數會在下一篇文章介紹
        $channel->queue_declare('white', false, true, false, false, false);
        //將消息發送到隊列,這里並不是直接將消息發送到隊列,而是通過交換機間接發送到隊列
        $channel->basic_publish($msg, '', 'white');

        echo "product: send msg success\n";
    }
}

控制台:

php yii product

RabbitMQ出現了一個white隊列,里面有一條消息未被消費:

 

消費者:

<?php

namespace app\commands;

use yii\console\Controller;
use PhpAmqpLib\Connection\AMQPStreamConnection;

class ConsumeController extends Controller
{
    public function actionIndex()
    {
        $conn = new AMQPStreamConnection('localhost', 5672, 'admin', 'admin', 'test_host');
        $channel = $conn->channel();

        $callback = function ($msg) {
            if (true) {
                echo "consume: " . $msg->body . "\n";
                //確認消費
                $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
            } else {
                //進行回滾操作
            }
        };

        /*
         * prefetch_count = 1,一次只消費一條消息
         * no_ack = false,消費成功后回復ack
         */
        $channel->basic_qos(null, 1, null);
        $channel->queue_declare('white', false, true, false, false, false);
        $channel->basic_consume('white', '', false, false, false, false, $callback);

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

控制台:

php yii consume

此時white隊列中的一條消息已經被消費:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM