가장 간단한 PHP RabbitMQ의 큐 모드는 생산자와 소비자로 구성되어 있습니다. 아래 아키텍쳐에서 보여지는 것과 같습니다.
해설:
P는 생산자를 나타내고, C는 소비자를 나타내며, 빨간색은 큐를 나타냅니다.
현재 PHP로 RabbitMQ를 작동시킬 때 공식적으로 권장하는 패키지는 php-amqplib입니다.
1. 튜토리얼 전 사전 준비
관련 지식을 이해하기 위해 먼저 다음 섹션을 읽어주세요:
2. PHP 종속성 설치
컴포저를 사용하여 설치해주세요:
composer require php-amqplib/php-amqplib
참고: php-amqplib의 최신 버전은 PHP 7.0 이상을 필요로 합니다.
php-amqplib 패키지를 가져오기:
require_once __DIR__ . '/vendor/autoload.php';
3. 메시지 전송
3.1. RabbitMQ 연결 생성
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
매개변수 설명:
- new AMQPStreamConnection('RabbitMQ 서버 주소', 포트 번호, '사용자명', '비밀번호');
3.2. 채널 생성
$channel = $connection->channel();
대부분의 작업은 채널에서 완료됩니다.
3.3. 큐 선언
$channel->queue_declare(
'tizi365_hello', // 큐 이름, 고유해야 합니다
false,
true, // 내구성 여부
false,
false
);
3.4. 메시지 전송
// 메시지 객체 정의, 매개변수는 전송할 메시지 내용입니다
$msg = new AMQPMessage('안녕, 세상아!');
// 메시지의 내구성 여부
// $msg->set('delivery_mode', AMQPMessage::DELIVERY_MODE_PERSISTENT);
// 메시지 전송
$channel->basic_publish(
$msg, // 메시지 객체
'', // 거래소 무시
'tizi365_hello' // 라우팅 매개변수, 여기서는 큐 이름을 라우팅 매개변수로 사용합니다
);
3.5. PHP 메시지 전송 코드 완성
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// 연결 생성
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// 채널 생성
$channel = $connection->channel();
// 큐 선언
$channel->queue_declare('tizi365_hello', false, false, false, false);
// 메시지 객체 정의
$msg = new AMQPMessage('안녕, 세상아!');
// 메시지 전송
$channel->basic_publish($msg, '', 'tizi365_hello');
echo " [x] '안녕, 세상아!' 전송 완료\n";
$channel->close();
$connection->close();
파일에 저장: send.php
4. 메시지 소비
메시지 소비의 첫 세 단계(라비트엠큐 연결 생성, 채널 생성, 큐 선언)은 메시지 전송과 동일하며, 각각 3.1, 3.2, 3.3 절에 해당합니다.
소비자 코드 전체는 다음과 같습니다:
<?php require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
// 라비트엠큐 연결 생성
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// 채널 생성
$channel = $connection->channel();
// 큐 선언
$channel->queue_declare('tizi365_hello', false, false, false, false);
echo " [*] 메시지 수신 대기 중. 종료하려면 CTRL+C를 누르세요.\n";
// 메시지 처리 함수 정의 (여기서는 익명 함수 사용)
$callback = function ($msg) {
// 메시지 처리 논리
echo ' [x] 받은 메시지: ', $msg->body, "\n";
};
// 소비자 생성
$channel->basic_consume(
'tizi365_hello', // 소비될 큐 이름
'', // 소비자 태그, 무시할 경우 고유한 ID가 생성됨
false,
true, // 메시지를 자동으로 인식할지 여부, 즉, 라비트엠큐에 메시지가 성공적으로 처리되었음을 자동으로 알릴지 여부
false,
false,
$callback // 메시지 처리 함수
);
// 채널이 닫히지 않은 경우 프로세스가 종료되지 않도록 프로세스를 차단함
while ($channel->is_open()) {
$channel->wait();
}
// 리소스 해제
$channel->close();
$connection->close();
파일로 저장: recv.php
5. 데모 실행
두 개의 셸 창을 열고 두 스크립트를 별도로 실행하세요:
php recv.php
php send.php