В результате поиска решения появился следующий класс
use PhpAmqpLib\Connection\AMQPStreamConnection;
class MessageConsumer
{
private $channel;
private $exchange = "message";
public function __construct()
{
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$this->channel = $connection->channel();
}
public function listen()
{
$this->channel->exchange_declare($this->exchange, 'direct', false, true, false);
while (true) {
$this->channel->wait();
}
}
public function addQueue($queue)
{
$this->channel->queue_declare($queue, false, false, false, false);
$this->channel->queue_bind($queue, $this->exchange, $queue);
$this->channel->basic_consume($queue, '', false, true, false, false, [$this, 'processMessage']);
}
public function processMessage($msg)
{
echo "[x] {$msg->delivery_info['routing_key']} : $msg->body \n";
}
}
Клиентский код примерно таков
use MessageConsumer;
$consumer = new MessageConsumer();
$consumer->addQueue('admin');
$consumer->addQueue('user');
$consumer->listen();
Тут же возникает вопросы:
1. Как и где хранить экземпляр класса MessageConsumer? Скорее экземпляр AMQPChannel текущего соединения
2. Как восстановить работу чата при падении демона? обрыве соединения?