개발 꿀팁/PHP

PHP는 RabbitMQ 인스턴스 사용

Jammie 2022. 6. 30. 16:38
반응형

CentOS 6.9 설치 RabbitMQ와 소스 코드 컴파일 설치 php의 RabbitMQ 확장
RabbitMQ 입문 기초
CentOS7 소스 컴파일은 nginx+php7.2+mysql5.7을 설치하고 syst를 사용한다.emctl 관리
RabbitMQ의 설치 과정, 워크플로우, 일부 기본 개념은 이미 앞의 노트에 언급되어 있습니다. 오늘php 연결 Ra를 로컬로 구현했습니다.bbitMQ, 그리고 메시지의 생산과 소비의 과정은 생산자와 소비자가 없는 기본 RabbitMQ 관리 인터페이스를 먼저 살펴본다.캡처:
Connections:

연결 없음 (Connections)
채널s:

아직 채널(Channels)이 없습니다
Exchange:

스위치에 기본 시스템만 있음
Queues:

아직 아무런 대열도 없다
소비자 코드 consumer.php를 먼저 등록하다

<?php
/**
 * Created by PhpStorm.
 * User: jmsite.cn
 * Date: 2019/1/15
 * Time: 13:16
 */
//연결 매개 변수 선언
$config = array(
    'host' => '192.168.75.132',
    'vhost' => '/',
    'port' => 5672,
    'login' => 'test',
    'password' => 'test'
);
//연결해broker
$cnn = new AMQPConnection($config);
if (!$cnn->connect()) {
    echo "Cannot connect to the broker";
    exit();
}
//연결 안에 채널을 만듭니다
$ch = new AMQPChannel($cnn);
//스위치 만들기
$ex = new AMQPExchange($ch);
//선언 라우팅 키
$routingKey = 'key_1';
//스위치 이름 선언
$exchangeName = 'exchange_1';
//스위치 이름 설정
$ex->setName($exchangeName);
//스위치 종류 설정
//AMQP_EX_TYPE_DIRECT:직결 교환기
//AMQP_EX_TYPE_FANOUT:섹터 스위치
//AMQP_EX_TYPE_HEADERS:헤드스위치
//AMQP_EX_TYPE_TOPIC:테마 스위치
$ex->setType(AMQP_EX_TYPE_DIRECT);
//스위치 영속 설정
$ex->setFlags(AMQP_DURABLE);
//선언 교환기
$ex->declareExchange();
//메시지 큐 만들기
$q = new AMQPQueue($ch);
//큐 이름 설정
$q->setName('queue_1');
//대기 행렬 지속 시간 설정
$q->setFlags(AMQP_DURABLE);
//메시지 큐를 선언합니다
$q->declareQueue();
//스위치와 큐 통과$routingKey결박을 진행하다
$q->bind($ex->getName(), $routingKey);
//메시지를 수신하여 처리하는 콜백 방법
function receive($envelope, $queue) {
	//2초 동안 휴면하고,
    sleep(2);
	//echo메시지 내용
    echo $envelope->getBody()."\n";
	//명시적 확인, 큐는 소비자의 명시적 확인을 받으면 메시지를 삭제합니다
    $queue->ack($envelope->getDeliveryTag());
}
//메시지 큐의 소비자 콜백 방법을 설정하고 차단합니다
$q->consume("receive");
//$q->consume("receive", AMQP_AUTOACK);//암묵적으로 확인, 추천하지 않음

이상이 컨슈머 코드입니다. 두 개의 명령줄/단말기를 엽니다.
php consumer.php 입력, 지우기아래 그림과 같이, 소비자가 메시지를 가로채기 시작했다.

이 때 RabbitMQ 관리 인터페이스를 다시 봅니다.
Connections

두 개의 연결고리가 생기고, 두 개가 바로 소비자이기 때문이다.막힌 채로 메시지를 기다리다
채널스

소비자는 각자의 연결 안에서 모두 하나의 통로를 열었다
익스체인지스

소비자 중 한 명이 영구적인 직결 교환기를 만들었다
Queues

메시지 큐가 생성되었지만 메시지 수가 0입니다.아직 생산자가 없다

<?php
/**
 * Created by PhpStorm.
 * User: jmsite.cn
 * Date: 2019/1/15
 * Time: 13:15
 */

$config = array(
    'host' => '192.168.75.132',
    'vhost' => '/',
    'port' => 5672,
    'login' => 'test',
    'password' => 'test'
);
$cnn = new AMQPConnection($config);
if (!$cnn->connect()) {
    echo "Cannot connect to the broker";
    exit();
}
$ch = new AMQPChannel($cnn);
$ex = new AMQPExchange($ch);
//정보의 경로 키는 반드시 소비자와 일치해야 한다
$routingKey = 'key_1';
//교환기의 명칭은 반드시 소비자측과 일치해야 한다,
$exchangeName = 'exchange_1';
$ex->setName($exchangeName);
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE);
$ex->declareExchange();
//10개의 메시지 만들기
for ($i=1;$i<=10;$i++){
	//메시지 내용
    $msg = array(
        'data'  => 'message_'.$i,
        'hello' => 'world',
    );
	//스위치에 메시지를 보내고 결과를 반환합니다
	//delivery_mode:2 선언문 지속, 지속적 큐+지속적 소식은RabbitMQ다시 시작해야 분실되지 않습니다
    echo "Send Message:".$ex->publish(json_encode($msg), $routingKey, AMQP_NOPARAM, array('delivery_mode' => 2))."\n";
	//코드 실행이 끝나면 프로세스가 자동으로 종료됩니다
}

생산자를 집행하기 전에 소비자를 모두 폐쇄했기 때문에, 그 소식은 대기 행렬에서 기다리고 있다.
메시지를 보낼 때 delivery_mode:2를 설정하여 메시지 지속성을 선언하기 때문입니다.RabbitMQ를 재부팅하면 메시지가 다시 재생됩니다. 이때 소비자를 다시 실행하여 두 개의 명령줄/단말기를 열고 php consumer.php를 입력하면 메시지가 소비되는 것을 볼 수 있습니다

반응형