Как отправить сообщение с сервера в веб-сокет канал?

Продублирую вопрос habrahabr.ru/post/266931/#comment_8574827
Как отправить запрос с клиента и уведомить всех других подписчиков канала — это ясно.
Как поймать и обработать на сервере то, что было отослано клиентом — тоже понятно.
Это все делает https://github.com/BrainBoxLabs/brain-socket.

А вот как сделать так, чтобы с сервера отправить сообщение в канал

Пример: кроном раз в минуту забирается результаты матчей с удаленного сервера. Записываются в базу.
Те, кто откроет страницу — им результаты покажутся из сгенерированной страницы.
Как уведомить тех, кто не обновлял страницу?

На реалплексоре Котерова такую задачу решали на раз-два, но таскать его и устанавливать за собой проблематичнее, чем установка того же BrainSocket из композера и запуск сервера.

я просто надеялся, что есть такой же механизм как в dklab.ru/lib/dklab_realplexor
------------------------------------------------------------------------
JAVASCRIPT: подписываемся на каналы, будем их прослушивать
------------------------------------------------------------------------
// Create Dklab_Realplexor client.
var realplexor = new Dklab_Realplexor(
"rpl.YourSite.com", // Realplexor's engine URL; must be a sub-domain
"demo_" // namespace
);

// подписка на сообщения отправленные мне лично
realplexor . subscribe(
    "user_1", function (result, id) {
        switch (result . type) {
            case 'private':
                console . log('Вам пришло личное сообщение:');
                console . log('Отправитель: ' + result . sender);
                console . log('Текст: ' + result . text);
                break;
        }
    }
);
//подписка на сообщения для всех
realplexor . subscribe(
    "all", function (result, id) {
        switch (result.type) {
            case 'alert':
                alert(result.message);
                break;
        }
    }
);
// Apply subscriptions. Сallbacks are called asynchronously on data arrival.
realplexor.execute();


------------------------------------------------------------------------
PHP отправка сообщений сразу в нужный канал
------------------------------------------------------------------------
// Create new API object to access Realplexor server.
require_once "Dklab/Realplexor.php";
$rpl = new Dklab_Realplexor("127.0.0.1", "10010", "demo_");
...
// отправим персональные сообщения пользователю с ID=1 и ID=2
$rpl->send(
    ["user_1", "user_2"], [
        'type'   => 'private',
        'sender' => 'Admin',
        'text'   => 'Привет!',
    ]
);
// отправим всем
$rpl->send(
    ["all"], [
        'type'   => 'alert',
        'message' => 'Окончен матч "Команда1:Команда2", результат матча - 0:2',
    ]
);
  • Вопрос задан
  • 2095 просмотров
Решения вопроса 1
Groove
@Groove Автор вопроса
Остановился на dklab.ru/lib/dklab_realplexor
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
akubintsev
@akubintsev
Опытный backend разработчик
https://github.com/ratchetphp/Pawl - вебсокет-клиент

Но как мне кажется, лучше для данной задачи подошел бы менеджер очередей.
Тут хороший пример socketo.me/docs/push
Ответ написан
Комментировать
@lyeskin
Если я правильно понял вопрос, то :
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
if( socket_connect ( $socket , 'IP сокета', 'порт') ) { //третий аргумент не обязателен
     $msg = 'hello';
     socket_write ( $socket , $msg, strlen($msg) ); //третий аргумент не обязателен
     //вместо socket_write можно использовать socket_send
}
Ответ написан
@aleks_raiden
Это возможно только, если вебсокет - выделенный сервер, который работает постоянно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы