가장 간단한 PHP RabbitMQ의 큐 모드는 생산자와 소비자로 구성되어 있습니다. 아래 아키텍쳐에서 보여지는 것과 같습니다. 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