1. 사전 튜토리얼
다음 섹션을 먼저 읽어서 관련 지식을 이해하십시오.
- RabbitMQ 기본 개념
- RabbitMQ 주제 패턴의 원리
- PHP RabbitMQ 빠른 시작 장 (필수, 이후 장에서는 코드를 중복해서 표시하지 않고 핵심 코드만 보여줍니다)
- PHP RabbitMQ 발행/구독 패턴 장 (필수, 거의 동일한 코드이지만, 교환 유형 및 라우팅 매개변수만 다릅니다)
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)와 일치하기 때문에 메시지를 수신할 수 있습니다.