PHP RabbitMQ 튜토리얼 (3 개)

게시 / 구독

우리는 하나의 작업 큐를 생성하고, 특정 클라이언트에 대기열 대응을 전송하는 작업을 가정합니다. 이 장에서 우리는 완전히 다른 일을 뭔가를 할 것입니다 - 우리는 또한 "공개 / 등록"모델로 알려진 다수의 소비자에게 메시지를 보내드립니다.

(가) 제 로그 정보를 송신하는 것이며, 두번째는 수신 로그를 인쇄하는 것 -이 패턴을 설명하기 위해 두 개의 프로그램 구성 (이하, 기록 시스템이라고도 칭 로깅 시스템) 간단한 로깅 시스템을 만들 것이다.

이 시스템은, 수신 끝이 하드 디스크에 저장된 로그를 넣어 실행을 실시간으로 화면에 로그를 표시하기 위해 다른 수신단을 실행할 수 있습니다 그래서, 정보를 수신하는 프로그램 실행의 각 수신 측을 기록합니다.

본질적으로, 내용 로그는 수신 측 모두에 방송된다.

스위치

우리는 소개 모든 사람을위한 RabbitMQ 메시징 모델을 완료하는 것을 지금, 큐에서 이전 장에서 보낸 메시지를받을 수 있습니다.

의 신속 이전 장 내용의 뒷면을 통해 가자 :

>生产者是一个用来发送消息的程序

>队列是一个存储消息的缓冲区

>消费者是一个接收消息的程序

RabbitMQ 메시징 모델의 핵심 아이디어는 생산자가 메시지를 전송한다 대기열 생산자가 알지도 못하는 정상적인 상황에서, 사실, 어떤 메시지 큐에 직접 전송되지 않을 것입니다.

생산자가 스위치에 메시지를 보낼 수 있습니다 스위치는 매우 간단합니다. 반면에, 한 손에 제조자로부터 메시지를 수신하면 메시지 큐를 밀어. Exchange는 수신 된 메시지가 큐에 밀어 처리하는 방법을 알고 있어야합니다? 여러 큐에 밀어? 또는 메시지를 폐기합니다. 이 규칙은 스위치 유형 (교환 형)에 의해 지정됩니다.

직접, 주제, 헤더, 팬 아웃 : 여기에 스위치의 몇 가지 종류가 있습니다. 여기에서 우리는, 마지막 -fanout에 초점 팬 아웃 스위치라는 로그의 유형을 만들 수 있습니다.

$channel->exchange_declare('logs','fanout',false,false,false);

팬 아웃 스위치는 매우 간단합니다, 당신은의 모든받은 메시지 모두는 큐 알고에 방송의 기능의 이름과 기능에 어떤 우리의 로그 시스템 요구 사항을 추측 할 수있다.

스위치 목록

당신은 rabbitmqctl 명령 목록을 서버의 모든 스위치를 사용할 수 있습니다 :

sudo rabbitmqctl list_exchanges

Listing exchanges ...
        direct
amq.direct      direct
amq.fanout      fanout
amq.headers     headers
amq.match       headers
amq.rabbitmq.log        topic
amq.rabbitmq.trace      topic
amq.topic       topic
logs    fanout
...done.

기본적으로 만들어지는 스위치 중 일부는, 그들이 사용에 대한 필요성을 덜 지금 이름없는 스위치의 숫자가 어떤 결과 *. AMQ하고.

이름 스위치

이전 섹션에서 우리는 메시지를 보낼 수있는 큐 때까지 스위치의 아무것도 몰라. 아마 우리가 널 (null) 문자열 ","기본 스위치의 정의를 사용 were're 때문이다.

발표 방법 이전에 기억 :

$channel->basic_publish($msg,'','hello');

여기에 기본 또는 익명의 스위치이다 : 그것은 라우팅 키가 두 번째 인수 인이있는 경우 메시지는 routing_key에 의해 지정된 이름을 가진 큐에 라우팅 : 메시지는 우리가 기본 또는 무명 교환을 사용하여 다음 routing_key 값입니다. basic_publish에

이제 큐에 메시지를 게시 할 수 있습니다.

$channel->exchange_declare('logs','fanout',false,false,false);
$channel->basic_publish($msg,'logs');

임시 큐

어쩌면 당신은 우리가 지정된 큐 이전에 사용 기억 (안녕하세요 task_queue 큐를 기억하고 그것을 큐?). 당신은 큐가 중요한 이름을 지정할 수 있습니다 - 우리는 같은 큐에 작업자를 지정해야합니다. 생산자와 소비자가 대기열 이름에 동일한 큐를 사용할 때 매우 중요합니다.

우리의 시스템 로그 상황이 다를뿐, 우리 모두에게 뉴스가 아니라 그것의 한 부분을 수신 할, 우리가 대신 이전의 최신 뉴스에 관심을, 두 가지 작업을 수행하는 것이 필요하다.

RabbitMQ에 연결하면 첫째, 빈 대기열이 필요합니다, 당신은 수동으로 더 나은 방법은, 큐의 임의의 이름을 만들거나 할 수 있습니다, 우리는 무작위로 서버 대기열 이름을 선택하자.

둘째, 소비자와 연결 해제되면 필요가 자동으로 삭제 큐에. 큰 상자   PHP RabbitMQ 튜토리얼 (C) ρ->

에서 PHP-amqplib 우리가 빈 큐의 이름을 만들 때, 사실, 한 세대가 아닌 영구 큐 이름입니다 만들었습니다.

list($queue_name, ,) = $channel->queue_declare("");

방법을 수행 한 후, $ 대기열 이름 변수는 생성 된 문자열 RabbitMQ가 포함되어 있습니다. 예를 들어, 아마도이 : - JzTY20BRgKO-HjmUJj0wLg amq.gen.

연결이 닫힐 때 큐가 고유하므로, 큐는 삭제됩니다.

바인딩 (Bindlings)

팬 아웃 교환 유형과 우리가 만든 큐. 이제 우리는 큐에 메시지를 보내도록 스위치를 확인해야합니다. 스위치 및 바인딩 큐 호 관계 (바인딩)

$channel->queue_bind($queue_name,'logs');

이제 메시지를 전환됩니다 로그 큐에 추가됩니다.

상장 바인딩 (목록 바인딩)

당신은 rabbitmqctl의 list_bindings가 사용되는 존재 인 모든 바인딩을 나열 할 수 있습니다.

통합

생산자 로그 메시지를 전송하고, 코드가 다를를 보지 않는다하기 전에, 가장 중요한 변화가 지금 우리의 로그 교환기에 메시지를 보내려고, 송신 routing_key하지만, 팬 아웃 형 교환기를 제공 할 필요가있다 이 값은 무시할 수있다. 다음은 emit_log.php 코드입니다.

<?php

require_once __DIR__ .'/verdor/autoload.php';
use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

$connection = new AMQPStreamConnection('localhost',5672,'guest','guest');
$channel = $channel->channel();

$channel->exchange_declare('logs','fanout',false,false,false);

$data = implode(' ',array_slice($argv,1));

if(empty($data)) $data = "info:Hello World";
$msg = new AMQPMessage($data);

$channel->basic_publish($msg,'logs');

echo "[x]Sent ",$data,"n";

$channel->close();
$connection->close();
?>

( emit_log.php )

당신이 볼 수 있듯이, 설립 연결이 존재하지 않는 교환에 메시지를 전송하는 것은 금지되어 있기 때문에이 단계가 필요하며, 스위치를 선언합니다.

큐가 교환기에 결합되어 있지 않은 경우, 정보는 잃었지만, 우리에게 이는 소비자가 듣지 않는 경우에, 우리는 안전하게 메시지를 폐기 할 수 있습니다.

receive_logs.php :

<?php

require_once __DIR__ .'/vendor/autoload.php';
use PhpAmqpLibConnectionQMAPStreamConnection;

$connection = new AMQPStreamConnection('localhost',5672,'guest','guest');
$channel = $connection->channel();

$channel->queue_bind($queue_name,'logs');

echo '[*] Waiting for logs. To exit press CTRL+C',"n";

$callback = function($msg){
	echo '[x]',$msg->body,"n";
};

$channel->basic_consume($queue_name,'',false,true,false,false,$callback);

whild(count($channel->callbacks)){
	$channel->wait();
}

$channel->close();
$connection->close();
?>

( receive_logs.php )

당신이 로그를 파일로 저장하려면, 당신은 명령을 입력 할 수 있습니다

php receive_logs.php > logs_from_rabbit.log

화면 로그에 표시하려면 새 터미널 및 실행을 엽니 다

php receive_logs.php

로그 보내기 :

php emit_log.php

사용 rabbitmqctl의 list_bindings 코드가 같은 것을 볼이 receive_logs.php를 실행할 때 바인딩과 큐를 생성 않는 것을 확인할 수 있습니다 :

sudo rabbitmqctl list_bindings
Listing bindings ...
logs    exchange        amq.gen-JzTY20BRgKO-HjmUJj0wLg  queue           []
logs    exchange        amq.gen-vso0PVvyiRIL2WoV3i48Yg  queue           []
...done.

결과의 해석은 매우 간단 들어, 두 개의 서버로 송신 데이터 로그 교환기는 우리가 달성하고자하는 것 인 큐를 지정했습니다.

메시지의 일부를 모니터링하는 방법을 알아 내기 위해 원, 파트 IV로 이동합니다.

원본 주소 : 구독 / 게시

추천

출처www.cnblogs.com/lijianming180/p/12099814.html