Организация взаимодействия между PHP приложением и PHPDaemon (уведомление клиентам через WebSocket)

Serge_php

Новичок
Добрый день, господа профессионалы.

у меня вопрос.
Есть PHPDaemon, работает (проверил на тестовом class MyWebSocket extends \PHPDaemon\Core\AppInstance ...).

На этом же сервере есть работающее ООП приложение на PHP, которое обрабатывает HTTP запросы, отдаёт страницы, принимает POST запросы на изменение данных в БД и т.д.

Возникла острая необходимость при выполнении запроса на запись данных в этом приложении сообщить всем клиентам, подключенным к websocket (соединение установлено) о факте изменения данных (и что именно изменилось).

Вопрос в следующем - как можно из приложения PHP обратиться к серверу PHPDaemon и передать ему данные (чтобы он выполнил через websocket рассылку этих данных всем подключённым к нему клиентам).

Уровень моих знаний и опыта реально мал, поэтому прошу давать как можно более развёрнутые ответы.

А если кто-то сможет набросать рабочий пример такого взаимодействия, то у моей благодарности не будет границ! в разумных, разумеется, пределах! ;)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
если это объявление о работе - нужно указать сумму компенсации

если нет - как насчет уровня опыта использования гугла?
правилами форума декларируется запрет на создание тем с вопросами, которые описаны в документации
 
Последнее редактирование:

флоппик

promotor fidei
Команда форума
Партнер клуба
Да ладно, вполне валидный вопрос. Как такое в документации прочитать — я тоже слабо представляю.

Короткий ответ: Никак.
Длинный ответ: Написать приложение для пхпдемона, которое примет уведомление снаружи и разошлет клиентам, подключенным в вебсокет (сюрприз-сюрприз, знаю). В самом пхпдемоне есть пример встроенного PubSub, можно попробовать использовать его:

https://github.com/kakserpom/phpdaemon/blob/master/PHPDaemon/Examples/ExamplePubSub.php
https://github.com/kakserpom/phpdaemon/blob/master/PHPDaemon/Examples/ExamplePubSubWebSocketRoute.php

Я сам делал похожее, но у меня там у демона redis pubsub в который ходит vuex store через вебсокет, и всем остальным клиентам пропихивает события, и все это роутится нджинксом, ибо нужно wss и сколько нибудь к понятному примеру это крайне далеко.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
В целом, эти задачи далековаты от базовых знаний в пхп.
 

AnrDaemon

Продвинутый новичок
Я бы раббит/редис/… прикрутил. Насиловать БД ради оповещения как-то…
Хотя конечно зависит от критичности оповещения.
 

fixxxer

К.О.
Партнер клуба
Я такое тоже делал через redis pubsub, только на ratchet. В основном потому, что redis уже так или иначе в проекте был, и уведомления нужны были в обе стороны (со стороны приложения разбиралка очереди).
Если нужно только из основного приложения в вебсокет-демон (но не в другую сторону), и 100% гарантии доставки не требуется (даже если это не udp, демон может в какой-то момент рестартиться), можно и банально слушать в демоне сокет, а из приложения туда слать уведомления.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
@флоппик, тут вариантов куча. Можно из php-приложения клиентом подключаться на вебсокет-роутер, и транслировать. Можно поднять на вебсокет-роутере http-сервер, и работать с фронт-приложением по REST API. Можно принимать запросы клиентов сервером PHPDaemon напрямую. И еще десяток вариантов.

Какое отношение к теме имеют базовые знания PHP, если человеку нужны вебсокеты, и он уже выбрал PHPDaemon? Он не спрашивает как лучше спроектировать решение, где почитать, с чего начать. Задача принимать в php сабмит формы и броадкастить сообщение по веб-сокетам делается за пол-часа, но с технологиями надо разбираться неделю. Нет, ему нужно быстро. Я вижу тут острую необходимость не напрягаться.
 
Последнее редактирование:

Serge_php

Новичок
прежде всего, всем огромное спасибо за ответы и советы.
что такое PHP, где он выполняется и прочие базовые знания у меня есть. :)
а вот сокеты, очереди, REDIS, PHPDaemon находятся (надеюсь пока) вне моего понимания. :(

В самом пхпдемоне есть пример встроенного PubSub, можно попробовать
да ну, через БД SQL передавать запросы - это как-то криво, на мой взгляд. :( я об этом уже думал, но отодвинул эту мысль в дальний угол, надеюсь, что найдётся более прямой путь.

Нет, ему нужно быстро. Я вижу тут острую необходимость не напрягаться.
Извините, товарищ, но Вы не правы. :(
я очень даже напрягаюсь, гуглю, читаю документацию по PHPDaemon, но пока безрезультатно. :(
Да, конечно, это скорее всего проблема во мне, я с этим спорить не собираюсь.
Но именно по этому я и обратился за помощью на форум.
Мне бы примерчик рабочий.... :(

Можно из php-приложения клиентом подключаться на вебсокет-роутер, и транслировать.
вот, например, как из приложения на PHP можно подключиться к PHPDaemon и отправить сообщение?
на JS это делается через var ws=new WebSocket("ws://192.168.21.229:8047/myws");
а на PHP как это сделать?

Можно поднять на вебсокет-роутере http-сервер, и работать с фронт-приложением по REST API.
Этот вариант тоже вполне устраивает. Но опять таки разобраться, как это сделать, я не могу.

Задача принимать в php сабмит формы и броадкастить сообщение по веб-сокетам делается за пол-часа, но с технологиями надо разбираться неделю.
Точно так.

если это объявление о работе - нужно указать сумму компенсации
Нужна компенсация, значит будет компенсация. В конце концов за знания и опыт нужно платить!
Вы возьмётесь за то, чтобы написать рабочий пример? Во сколько Вы оцениваете этот труд?


p.s. ужасно! чувствую себя тупым неграмотным ленивым попрошайкой... :(
извините меня, друзья, если сможете...
 

флоппик

promotor fidei
Команда форума
Партнер клуба
да ну, через БД SQL передавать запросы - это как-то криво, на мой взгляд
Там ничего через бд в примере не передается. Там наоборот, ответ от бд пропихивается всем клиентам. Это просто пример, самому PubSub в демоне без разницы, откуда получить данные.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
да ну, через БД SQL передавать запросы - это как-то криво, на мой взгляд. :( я об этом уже думал, но отодвинул эту мысль в дальний угол, надеюсь, что найдётся более прямой путь.
эта проблема называется "Синдром поиска глубинного смысла". Про базу данных речи не было.

Извините, товарищ, но Вы не правы. :(
я очень даже напрягаюсь, гуглю, читаю документацию по PHPDaemon, но пока безрезультатно. :(
Здесь нам нравится видеть, что человек делает. Давай ссылки на статьи, которые ты прочел по теме, задай вопросы по сути - и мы поможем.

Но именно по этому я и обратился за помощью на форум.
Мне бы примерчик рабочий.... :(
Прости, но этот форум существует с другой целью. http://phpclub.ru/faq/WhyForum

вот, например, как из приложения на PHP можно подключиться к PHPDaemon и отправить сообщение?
на JS это делается через var ws=new WebSocket("ws://192.168.21.229:8047/myws");
а на PHP как это сделать?
Хорошо. Я дал ссылку на пример реализации WS-клиента. Этот пример входит в состав кода PHPDaemon, который ты используешь. Он у тебя перед глазами.
В примере есть метод https://github.com/kakserpom/phpdaemon/blob/master/PHPDaemon/Clients/WebSocket/Example.php#L42
Он точно соответствует твоей просьбе о рабочем примере.

Скажи, прочел ли ты код примера, прежде чем третий раз повторить просьбу? Тебе пример нужен, или что-то другое?

Нужна компенсация, значит будет компенсация. В конце концов за знания и опыт нужно платить!
Вы возьмётесь за то, чтобы написать рабочий пример? Во сколько Вы оцениваете этот труд?
$70 в час, предоплатой, минимум $1000.
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
что такое PHP, где он выполняется и прочие базовые знания у меня есть. :)
а вот сокеты, очереди, REDIS, PHPDaemon находятся (надеюсь пока) вне моего понимания.
Противоречие, однако.
Т.е. вы понимаете, что PHP работает, но что осмысленно прервать его (впрочем, как и любого другого приложения) работу какими-то внешними сигналами без его на то желания - нельзя, вы не понимаете?
Это вот что сейчас было?… Другие люди не только смогли, они написали кучу документации да и просто сделали всё за тебя, бери и пользуйся, а ты в позу и "я не могу"? А в лоб?
 

fixxxer

К.О.
Партнер клуба
Как раз-таки signal-ом прекрасно прерывается. ;)

А с event loop-ом вообще отдельный разговор, когда приложение - это один большой конечный автомат (пусть вывернутый наизнанку) без блокирующих операций, рассуждать прерываниями странно.
 
Сверху