Первое знакомство с RabbitMQ
Работа с очередями RabbitMQ на php
12.04.2019
Общие мысли:
Нужно учитывать, что для обработки/получения сообщений php скрипт должен бесконечно работать в цикле.
Установка:
yum -y install epel-release yum -y install erlang yum -y install rabbitmq-server firewall-cmd --zone=public --permanent --add-port=4369/tcp --add-port=25672/tcp --add-port=5671-5672/tcp --add-port=15672/tcp --add-port=61613-61614/tcp --add-port=1883/tcp --add-port=8883/tcp firewall-cmd --reload systemctl start rabbitmq-server.service systemctl enable rabbitmq-server.service rabbitmq-plugins enable rabbitmq_management chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/ rabbitmqctl add_user mqadmin mqadminpassword rabbitmqctl set_user_tags mqadmin administrator rabbitmqctl set_permissions -p / mqadmin ".*" ".*" ".*" systemctl restart rabbitmq-server.service
После этого можно попасть в веб морду: http://192.168.XXX.XXX:15672/#/
Для работы php:
yum -y install php71w-bcmath composer require php-amqplib/php-amqplib
Отправка сообщений:
01_send.php (Download)
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPStreamConnection('192.168.XXX.XXX', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('queue1', false, false, false, false);
$msg = new AMQPMessage('Hello World!'.rand(1, 1000));
$channel->basic_publish($msg, '', 'queue1');
echo ' [x] Sent '.$msg->body."\n<br />";
$channel->close();
$connection->close();Получение сообщений:
02_receive.php (Download)
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$connection = new AMQPStreamConnection('192.168.XXX.XXX', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('queue1', false, false, false, false);
echo " [*] Waiting for messages. To exit press CTRL+C\n";
$callback = function ($msg)
{
echo ' [x] Received ', $msg->body, "\n";
};
$channel->basic_consume('queue1', '', false, true, false, false, $callback);
while (count($channel->callbacks))
{
$channel->wait();
}