Организация мгновенного чата

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Организация мгновенного чата

Сообщение Nafania »

anagamin писал(а):А вот за экстеншн спасибо - как раз в соседней теме спрашивал, как организовать связь с yii)
Подпишитесь на рсс, будете в курсе новинок.
serega_chem
Сообщения: 12
Зарегистрирован: 2015.07.15, 14:26
Откуда: Саранск

Re: Организация мгновенного чата

Сообщение serega_chem »

Прошел официальный туториал php/rabbitmq. Для закрепления материала хочу написать чат с использование websockets. В качестве сервера намереваюсь использовать Workerman.
Логика пока такая:
1. Сообщения попадают в общий exchange (с типом direct). Где routing key - id пользователя
2. При коннекте юзера создаётся очередь и присоединяется к обменнику по тому же id пользователя
Для обработки множества очередей набросал следующий класс

Код: Выделить всё

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. Как восстановить работу чата при падении демона? обрыве соединения?
serega_chem
Сообщения: 12
Зарегистрирован: 2015.07.15, 14:26
Откуда: Саранск

Re: Организация мгновенного чата

Сообщение serega_chem »

По второму вопросу:
Если известны все пользователи, что находятся онлайн, то это не проблема. Создаем или берём существующий канал и добавляем нужные нам очереди
Ответить