1. 사전 튜토리얼

다음 섹션을 먼저 읽어서 관련 지식을 이해하십시오.

2. 토픽 교환 정의

// 교환을 선언합니다
$channel->exchange_declare(
    'tizi365.topic', // 교환 이름, 고유해야하며 중복되어서는 안 됨
    'topic', // 교환 유형
    false,
    false, // 지속성 여부
    false
);

참고: 메시지 생성자와 소비자는 둘 다 교환을 필요로 합니다.

3. 메시지 전송

우리는 메시지를 교환에 보내고, 교환은 라우팅 규칙에 따라 해당 큐로 메시지를 전달합니다.

<?php

require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// RabbitMQ 연결 생성
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// 채널 생성
$channel = $connection->channel();

// 교환을 선언합니다
$channel->exchange_declare(
    'tizi365.topic', // 교환 이름, 고유해야하며 중복되어서는 안 됨
    'topic', // 교환 유형
    false,
    false, // 지속성 여부
    false
);

// 메시지 객체, 매개변수는 메시지 내용입니다
$msg = new AMQPMessage("안녕 tizi365.com");

// 메시지 보내기
// 라우팅 매개변수에 주목하세요
$channel->basic_publish(
    $msg, // 메시지 객체
    'tizi365.topic', // 교환 이름
    "www.tizi365.com" // 라우팅 매개변수, 요구 사항에 따라 임의로 정의할 수 있습니다
);

echo ' [x] Sent ', $msg->getBody(), "\n";

// 리소스 해제
$channel->close();
$connection->close();

4. 메시지 수신

4.1. 큐 및 익스체인지 바인딩 정의

큐 메시지를 소비하려면 먼저 큐를 정의한 후 해당 큐를 대상 익스체인지에 바인딩해야 합니다.

// 익명 큐 선언
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// 큐를 지정한 익스체인지에 바인딩
$channel->queue_bind(
    $queue_name, // 큐 이름
    'tizi365.topic', // 익스체인지 이름
    "*.tizi365.com" // 바인딩 라우팅 매개변수, 여기서 와일드카드 * (별표)를 사용하여 단일 단어와 일치시킬 수 있습니다

참고: 설정한 라우팅 매개변수는 모두 단일 단어와 일치하는 * (별표) 와일드카드를 사용합니다. # (해시)로 변경하면 여러 단어와 일치시킬 수 있습니다.

<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

// 래빗엠큐 연결 생성
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// 채널 생성
$channel = $connection->channel();

// 익스체인지 선언
$channel->exchange_declare(
    'tizi365.topic', // 익스체인지 이름, 고유해야 하며 중복될 수 없습니다
    'topic', // 익스체인지 유형
    false,
    false, // 지속성 여부
    false
);

// 익명 큐 선언
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// 큐를 지정한 익스체인지에 바인딩
$channel->queue_bind(
    $queue_name, // 큐 이름
    'tizi365.topic', // 익스체인지 이름
    "*.tizi365.com" // 바인딩 라우팅 키, 여기서 와일드카드 * 를 사용하여 단일 단어와 일치시킵니다
);

echo " [*] 메시지를 기다리는 중. 종료하려면 CTRL+C 를 누르세요\n";

// 메시지 처리 함수 정의 (여기서 익명 함수 사용)
$callback = function ($msg) {
    // 메시지 처리 로직
    echo ' [x] ', $msg->body, "\n";
};

// 컨슈머 생성
$channel->basic_consume(
    $queue_name, // 소비할 큐 이름
    '', // 컨슈머 태그, 무시할 경우 자동으로 고유한 ID가 자동으로 생성됩니다
    false,
    true, // 메시지를 자동으로 확인할지 여부, 즉, 래빗엠큐에 메시지가 성공적으로 처리되었음을 자동으로 알립니다
    false,
    false,
    $callback // 메시지 처리 함수
);

// 채널이 닫히지 않는 한 프로세스를 계속 차단하여 프로세스 종료를 피합니다
while ($channel->is_open()) {
    $channel->wait();
}

// 리소스 해제
$channel->close();
$connection->close();

익스체인지를 바인딩할 때 설정한 라우팅 매개변수인 *.tizi365.com은 메시지의 라우팅 매개변수(www.tizi365.com)와 일치하기 때문에 메시지를 수신할 수 있습니다.