Подпишитесь на рсс, будете в курсе новинок.anagamin писал(а):А вот за экстеншн спасибо - как раз в соседней теме спрашивал, как организовать связь с yii)
Организация мгновенного чата
Re: Организация мгновенного чата
-
- Сообщения: 12
- Зарегистрирован: 2015.07.15, 14:26
- Откуда: Саранск
Re: Организация мгновенного чата
Прошел официальный туториал php/rabbitmq. Для закрепления материала хочу написать чат с использование websockets. В качестве сервера намереваюсь использовать Workerman.
Логика пока такая:
1. Сообщения попадают в общий exchange (с типом direct). Где routing key - id пользователя
2. При коннекте юзера создаётся очередь и присоединяется к обменнику по тому же id пользователя
Для обработки множества очередей набросал следующий класс
Теперь можно написать и запустить демона
Тут же возникает вопросы:
1. Как и где хранить экземпляр класса MessageConsumer? Скорее экземпляр AMQPChannel текущего соединения
2. Как восстановить работу чата при падении демона? обрыве соединения?
Логика пока такая:
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. Как восстановить работу чата при падении демона? обрыве соединения?
-
- Сообщения: 12
- Зарегистрирован: 2015.07.15, 14:26
- Откуда: Саранск
Re: Организация мгновенного чата
По второму вопросу:
Если известны все пользователи, что находятся онлайн, то это не проблема. Создаем или берём существующий канал и добавляем нужные нам очереди
Если известны все пользователи, что находятся онлайн, то это не проблема. Создаем или берём существующий канал и добавляем нужные нам очереди
-
- Сообщения: 251
- Зарегистрирован: 2014.08.18, 14:01
Re: Организация мгновенного чата
Socket.io