PHP使用RabbitMQ實戰

用composer安裝rabbitmq客戶端庫:

composer require php-amqplib/php-amqplib

生產者:

<?php

require 'vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$conf = [
        'host' => '127.0.0.1',
        'port' => 5672,
        'user' => 'guest',
        'pwd' => 'guest',
        'vhost' => '/',
];
$exchangeName = 'hello'; //交換機名
$queueName = 'test'; //隊列名稱
$routingKey = 'test'; //路由關鍵字(也可以省略)

$conn = new AMQPStreamConnection( //建立生產者與mq之間的連接
    $conf['host'], $conf['port'], $conf['user'], $conf['pwd'], $conf['vhost']
);
$channel = $conn->channel(); //在已連接基礎上建立生產者與mq之間的通道


$channel->exchange_declare($exchangeName, 'direct', false, true, false); //聲明初始化交換機
$channel->queue_declare($queueName, false, true, false, false); //聲明初始化一條隊列
$channel->queue_bind($queueName, $exchangeName, $routingKey); //將隊列與某個交換機進行綁定,並使用路由關鍵字

$msgBody = json_encode(["contnet":"hello world"]);
$msg = new AMQPMessage($msgBody, ['content_type' => 'text/plain', 'delivery_mode' => 2]); //生成消息
$r = $channel->basic_publish($msg, $exchangeName, $routingKey); //推送消息到某個交換機

$channel->close();
$conn->close();

消費者:

<?php
require 'vendor/autoload.php';
//define('AMQP_DEBUG', true);
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$conf = [
        'host' => '127.0.0.1',
        'port' => 5672,
        'user' => 'guest',
        'pwd' => 'guest',
        'vhost' => '/',
];
$exchangeName = 'hello'; //交換機名
$queueName = 'test'; //隊列名稱
$routingKey = 'test'; //路由關鍵字(也可以省略)

$consumerTag = 'consumer';


$conn = new AMQPStreamConnection( //建立生產者與mq之間的連接
    $conf['host'], $conf['port'], $conf['user'], $conf['pwd'], $conf['vhost']
);
$channel = $conn->channel(); //在已連接基礎上建立生產者與mq之間的通道


$channel->exchange_declare($exchangeName, 'direct', false, true, false); //聲明初始化交換機
$channel->queue_declare($queueName, false, true, false, false); //聲明初始化一條隊列
$channel->queue_bind($queueName, $exchangeName, $routingKey); //將隊列與某個交換機進行綁定,並使用路由關鍵字


//false 消息只有在返回一個ack之後,纔會被刪除,  true 消息被取出之後 會被立即刪除
$no_ack = false;
$channel->basic_consume($queue, $consumerTag, false, $no_ack, false, false,function($msg){
    $message = $msg->body.PHP_EOL;
    echo $message;
    
    $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
});


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

$channel->close ();
$connection->close ();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章