Radchat c websocket и обычный PHP

259
10 июня 2017, 16:26

Пробую Redchat, чтобы реализовать один проект на виртуальном хостинге.

У проекта такая структура обмена данными: (1) - клиент, (2) - мой сервер (на виртуальном хостинге), (3) - чужой сервер.
Обмен нужен по сути между (1) и (3), но будет происходить только через мой (2).
То есть такая цепочка: (1) => (2) => (3) => (2) => (1).

Запросы поступают регулярно и чтобы снизить нагрузку на свой хостинг, решил организовать между (1) и (2) вебсокет.
А между (2) и (3) будет обычный http, потому что последний вебсокет всё равно не поддерживает.

И вот я сделал как в туториале по ссылке выше, всё работает, клёво.
Но не понимаю саму суть, как это подстроить под себя.
То есть не понимаю, куда слать запросы-то.

В примере мы шлем на локалхост по стандартному порту. На моем хостинге это будет просто адрес скрипта... верно? А какого скрипта?

Вот скрипт запуска сервера (chat-server.php):

require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8081
);
$server->run();

Запустить через консоль легко: php chat-server.php, запускается локальный хост и все запросы отправляются туда.
И Ratchat использует заготовленный скрипт для чата, тоже по уроку.

Что он делает вроде как вопросов не вызывает... Но я не понимаю, что нужно допилить, чтобы вставить это в свой хостинг? На openserver хотя бы для понимания, чтобы обмен данными по вебсокету происходил? Куда слать запросы? На какой-то скрипт?

И ещё не понятно, как организовать посылку сообщений для одного подключенного клиента.
То есть одно соединение - одна работа с ответами.
То есть у меня не идея в том, чтобы чат реализовывать, примеры которого просто кишат ютюбы и все статьи. А ничего другого вообще нет. (Погодите, а вдруг Ратчет именно этим и занимается, и нельзя создать коннекшн один к одному?)

В примере приводится такой код для отсеивания (в данном примере, сообщение передается всем, кроме подключенных соединений):

public function onMessage(ConnectionInterface $from, $msg) {
    foreach ($this->clients as $client) {
        if ($from !== $client) {
            // The sender is not the receiver, send to each client connected
            $client->send($msg);
        }
    }
}

Можно написать условие, чтобы сообщение отправлялось тому, кто его, собственно, прислал. Но будет ли это правильным способом? Я просто не уверен.

READ ALSO
Выбрать периоды из массива

Выбрать периоды из массива

Нужно получить интервалы заходов юзера 57, а он считается от его первого входа, до авторизации другого юзераСудя по массиву он входил 2 раза:...

239
Защита от инъекций

Защита от инъекций

Есть формаПередает данные методом POST В файле куда отправляются данные, такой код:

271
move_uploaded_file: failed to open stream: permission denied

move_uploaded_file: failed to open stream: permission denied

Нужно загрузить картинку на сервер но при переносе выдает ошибку

269
Правильная реализация long-polling

Правильная реализация long-polling

Наткнулся на код сервера, предназначение которого обеспечение ajax + long polling запросы к серверу

263