Enviando a primeira mensagem para o RabbitMQ
Hoje vou publicar a parte 2 da série de artigos sobre o RabbitMQ, se você caiu de paraquedas nesse artigo eu recomendo fortemente que você acesse o primeiro artigo desse seria para não ficar perdido no assunto. O primeiro artigo foi bastante teórico mais muito importante se você nunca ouviu falar ou sabe muito ponto sobre o RabbitMQ. Você pode acessar o primeiro artigo clicando neste link Introdução ao RabbitMQ.
Neste artigos nós vamos enviar a nossa primeira mensagem para o RabbitMQ, vou demonstrar com exemplos como é fácil de nós usarmos o PHP para fazer o envio(publicação) e receber(consumo) das mensagem no RabbitMQ.
Exchange default(AMQP default)
No RabbitMQ já vem com uma Exchange configurada por padrão nome dela é (AMQP default). Essa Exchange server como Exchange padrão do sistema, então se nenhuma Exchange for informada no hora de enviar a mensagem para o RabbitMQ essa Exchange que será acionada.
Routing key
Para entendermos como a Exchange (AMQP default) funcionado preciso explicar o conceito de Routing key. Uma Routing key (chave de roteamento) é uma chave que a Exchange pode usar para tomar a decisão de para qual fila enviar a mensagem. No caso da Exchange (AMQP default) você não informa uma Exchange mais deve informar uma Routing key. Assim está Exchange vai enviar a mensagem para fila de mesmo nome da Routing key.
Publicando uma mensagem.
Agora que entendemos o básico podemos finalmente partir para a implementação usando o PHP. Primeiro de tudo você precisa se certificar que o seu PHP possui as seguintes extensões ext-bcmath, ext-sockets. Instalar essas extensões é uma tarefa nada complicada, mas caso precisa de alguma ajuda, deixe um comentário que farei o possível para ajudar.
Com as extensões instaladas vamos instalar a biblioteca mais utilizada para trabalhar com AMQP que é o protocolo utilizado pelo RabbitMQ. Para fazer isso rode o seguinte comando.
composer require php-amqplib/php-amqplib
Agora com biblioteca instalada, vamos criar um arquivo será o responsável por enviar as mensagem para o RabbitMQ. Vamos ele de sender.php. Dentro desse arquivos vamos começar importantando com as classes que vamos precisar.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
Depois vamos precisar iniciar a comunicação passando quatro parâmetros o host a porta o usuário e a senha. Depois disso precisar estâncias um canal que será usado para enviar as mensagens.
$host = 'localhost';
$porta = 5672;
$usuario = 'guest';
$senha = 'guest';
$connection = new AMQPStreamConnection($host, $porta, $usuario, $senha);
$channel = $connection->channel();
Agora que temos o nosso canal vamos declarar uma fila com o nome minha_fila que caso ela não existe ela será criada no RabbitMQ.
$channel->queue_declare('minha_fila');
Você pode criar as filas previamente, se a fila já existir esse comando não é mais necessário. Isso também fará com que comunição com o RabbitMQ aconteça de forma bem mais rápida.
Vamos criar a nova mensagem que vamos enviar para a nossa nova fila.
$conteudo = 'primeira mensagem';
$msg = new AMQPMessage($conteudo);
E por fim vamos fazer a publicação, vamos precisar informar uma Exchange vazia e uma Routing key com o mesmo nome da fila que acabamos de criar.
$exchange = '';
$routingKey = 'minha_fila';
$channel->basic_publish($msg, $exchange, $routingKey);
echo "Mensagem enviada: '" . $conteudo . "'\n";
Para finalizar precisamos fechar a o canal e a conexão.
$channel->close();
$connection->close();
No final o nosso arquivo sender.php vai ter o seguinte conteúdo.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$host = 'localhost';
$porta = 5672;
$usuario = 'guest';
$senha = 'guest';
$connection = new AMQPStreamConnection($host, $porta, $usuario, $senha);
$channel = $connection->channel();
$channel->queue_declare('minha_fila');
$conteudo = 'primeira mensagem';
$msg = new AMQPMessage($conteudo);
$exchange = '';
$routingKey = 'minha_fila';
$channel->basic_publish($msg, $exchange, $routingKey);
echo "Mensagem enviada: '" . $conteudo . "'\n";
$channel->close();
$connection->close();
Se executarmos php sender.php no terminal veremos a seguinte mensagem.
[dbemfica@dbemfica-pc rabbitmq-php]$ php sender.php
Mensagem enviada: 'primeira mensagem'
Também podemos acessar o RabbitMQ no endereço http://localhost:15672/#/queues e podemos ver que a nossa mensagem foi enviada.
Consumindo uma mensagem
Agora que conseguimos enviar mensagens para o RabbitMQ está na hora de sabermos como podemos fazer o consumo destas mensagem. O processo e bem semelhante ao anterior vamos criar um aquivo consumer.php e dentro desse arquivo importar as classes que vamos precisar.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
Depois vamos precisar iniciar a comunicação da mesma forma que fizemos no processo anterior.
$host = 'localhost';
$porta = 5672;
$usuario = 'guest';
$senha = 'guest';
$connection = new AMQPStreamConnection($host, $porta, $usuario, $senha);
$channel = $connection->channel();
Também declaramos a fila para caso ela não exista.
$channel->queue_declare('minha_fila');
Sempre lembrando que esse processo é opcional
Agora as coisas mudam um pouco, vamos precisar criar uma função de callback de será responsável por processar a nossa mensagem. Neste caso vamos simplesmente imprimi-la na tela.
$callback = function ($msg) {
echo "Mensagem recebida '" . $msg->body . "'\n";
};
Para fazer o consumo usamos a função basic_consume e esta função pode receber um monte de parâmetros. Mas neste momento acho importante se atermos ao exemplo abaixo a onde basicamente passamos o nome da fila e a função callback e criamos anteriormente.
$queue = 'minha_fila';
$consumer_tag = '';
$no_local = false;
$no_ack = true;
$exclusive = false;
$nowait = false;
$channel->basic_consume($queue, $consumer_tag, $no_local, $no_ack, $exclusive, $nowait, $callback);
while ($channel->is_consuming()) {
$channel->wait();
}
Nos próximos artigos eu explicarem cada um dos parâmetros que a função basic_consume recebe.
Para finalizar precisamos fechar a o canal e a conexão como fizemos anteriormente.
$channel->close();
$connection->close();
No final o nosso arquivo consumer.php vai ter o seguinte conteúdo.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$host = 'localhost';
$porta = 5672;
$usuario = 'guest';
$senha = 'guest';
$connection = new AMQPStreamConnection($host, $porta, $usuario, $senha);
$channel = $connection->channel();
$channel->queue_declare('minha_fila');
$callback = function ($msg) {
echo "Mensagem recebida '" . $msg->body . "'\n";
};
$queue = 'minha_fila';
$consumer_tag = '';
$no_local = false;
$no_ack = true;
$exclusive = false;
$nowait = false;
$channel->basic_consume($queue, $consumer_tag, $no_local, $no_ack, $exclusive, $nowait, $callback);
while ($channel->is_consuming()) {
$channel->wait();
}
$channel->close();
$connection->close();
Se executarmos php consumer.php no terminal veremos a seguinte mensagem.
[dbemfica@dbemfica-pc rabbitmq-php]$ php consumer.php
Mensagem recebida 'primeira mensagem'
E também podemos acessar o RabbitMQ no endereço http://localhost:15672/#/queues e podemos ver que a nossa mensagem não está mais na fila.
Estes estes são os primeiros passos para entrarmos no mundo da mensageria, espero que esteja gostando, lembre-se que sempre precisar por deixar um comentário aqui no blog teria prazer em ajudar.
No artigo da semana que vem vou falar sobre o Tipo de Exchange fanout, espero ver você semana que vem. até lá.
Referências
https://www.cloudamqp.com/blog/2015-05-18-part1-rabbitmq-for-beginners-what-is-rabbitmq.html
https://www.rabbitmq.com/tutorials/tutorial-one-php.html
https://www.youtube.com/watch?v=RnIwwm00UPM
-
Olá Diogo, blz? Como posso adicionar as extensões ext-bcmath, ext-sockets? Pois não as encontrei no php.ini. Agradeço desde já! Obrigado!
-
Bom dia Carlos Qual o ambiente você está rodando o seu PHP (windows, linux, mac) e qual a versão do PHP você está usando?