Как подключиться к серверу Websocket с PHP-сервера, а не с Javascript

Я запускаю храповой сервер веб-сокетов. Из-за некоторых сложных обстоятельств мне нужно иметь возможность общаться с этим сервером веб-сокетов через мой PHP-сервер в реальном времени, а не через Javascript, чтобы иметь возможность отправлять ему информацию, которая затем будет передана позже любым клиентам, подключенным к Это.

Я немного просмотрел stackoverflow, но все о том, как создать сервер веб-сокетов с PHP, а это не то, что я ищу.

Ниже показано, чего я пытаюсь достичь.

введите здесь описание изображения

Ключевым моментом здесь является то, как подключиться к серверу Websocket, например храповику, с помощью PHP?


Вещи, которые я пробовал/рассматривал:

Я рассматривал возможность использования подхода сериализации. Это будет сериализация в базе данных и десериализация. Я не уверен, что это лучше, чем этот подход, пожалуйста, сообщите.

Здесь я начал: Пользователь и отправка сообщения вне экземпляра сервера


person Joseph Astrahan    schedule 30.03.2017    source источник
comment
Пожалуйста, дайте мне знать, почему отрицательный голос, пожалуйста, чтобы я мог дать более подробный вопрос. Я считаю, что я выполнил все критерии хорошего вопроса, я еще изменю свой вопрос, чтобы сослаться на другой, на котором он основан.   -  person Joseph Astrahan    schedule 30.03.2017
comment
Недавно я наткнулся на это, github.com/paragi/PHP-websocket-client, но я не могу заставить его работать, никогда не хочет подключаться к моему серверу веб-сокетов?   -  person Joseph Astrahan    schedule 30.03.2017


Ответы (1)


Я бы предложил использовать REST в качестве уровня API для связи между вашим приложением Symfony и приложением Ratchet. Потому что нет особого смысла использовать Websocket из вашего приложения Symfony. Веб-сокеты используются для двунаправленной связи в реальном времени, тогда как вам нужно отправить только часть данных из вашего приложения Symfony. Для этой цели более удобен HTTP REST API. В заключение, в вашем приложении Ratchet вы используете 2 сервера (Ratchet позволяет создавать столько серверов, сколько вы хотите в одном приложении): сервер веб-сокетов и http-сервер. В вашем приложении Symfony вы отправляете традиционные HTTP-запросы на свой сервер Ratchet.

введите здесь описание изображения

Вы можете создать несколько серверов Ratchet в одном приложении, например:

// 1. Create the event loop
$loop = React\EventLoop\Factory::create();

// 2. Create servers
// websocket
$webSock = new React\Socket\Server($loop);
new Ratchet\Server\IoServer(
    new Ratchet\Http\HttpServer(
        new Ratchet\WebSocket\WsServer( $wsConnectionsHandler )
    ),
    $webSock
);
$webSock->listen($portWS, '0.0.0.0');

// http
$httpSock = new React\Socket\Server($loop);
new Ratchet\Server\IoServer(
    new Ratchet\Http\HttpServer(
        $HTTPConnectionsHandler
    ),
    $httpSock
);
$httpSock->listen($portHTTP, '0.0.0.0');

// 3. Run the loop
$loop->run();

Как передать информацию с http-сервера на сервер websocket?

Приложение React/Ratchet — это приложение, управляемое событиями, как обычное приложение NodeJS. Таким образом, лучший способ взаимодействия компонентов приложения друг с другом — отправка/подписка на события. Например, вы создаете объект $eventDispatcher, передаете его каждому компоненту (http-handler и ws-handler), а затем используете $eventDispatcher->subscibe(eventName, func) и $eventDispatcher->emit(eventName, data) для подписки на события и их соответствующей отправки.


Если вы не уверены, вам нужно использовать клиентскую библиотеку Websocket для подключения к серверу Websocket. Их несколько, просто погуглите. Я лично никогда не использовал библиотеку PHP websocket-client, поэтому не могу ее рекомендовать.

person AlexM    schedule 30.03.2017
comment
Я думаю, что наконец-то понял, о чем вы говорите, как мне отправлять традиционные http-запросы на храповой сервер? Если я смогу это сделать, это тоже будет работать и будет лучше, я согласен. Сможет ли мой HTTP-сервер по-прежнему ссылаться на соединения с сервера webSocket? - person Joseph Astrahan; 30.03.2017
comment
Как передать информацию с http-сервера на сервер websocket? Кстати спасибо за картинку - person Joseph Astrahan; 30.03.2017
comment
Мне нужно сделать это, чтобы я мог обновлять клиент в режиме реального времени изменения из моего приложения symfony - person Joseph Astrahan; 30.03.2017
comment
Думаю, тогда я вижу, как это работает. Хитрость будет заключаться в создании глобальной ссылки на переменную client, используемую для хранения соединений для веб-сокетов, а затем где-то, чтобы http-сервер мог правильно реагировать на сервер веб-сокетов. Я попробую, и дальнейшие примеры, конечно, помогут показать этот процесс, но я думаю, что смогу это сделать. Дайте мне час на эксперимент. - person Joseph Astrahan; 30.03.2017
comment
Только что получил ваше сообщение о подписчиках событий, у вас случайно нет реальных примеров их использования в коде? А пока попробую угадать из документации. - person Joseph Astrahan; 30.03.2017
comment
Быстрый другой вопрос, как мое приложение symfony отправит HTTP-ответ на сервер, который мы только что создали с помощью храповика? я должен использовать cURL? Еще раз спасибо за все ваши подробные ответы - person Joseph Astrahan; 30.03.2017
comment
›› как мое приложение Symfony отправит HTTP-запрос на сервер? Это зависит от вас. Вы можете использовать CURL или библиотеку, например GuzzleHTTP, если хотите. - person AlexM; 30.03.2017
comment
К сожалению, у меня нет примера кода. Я разработал похожее приложение, но это был частный проект. - person AlexM; 30.03.2017
comment
Хорошо, дайте мне немного времени, чтобы попробовать это, я только что заставил http-сервер работать в то же время, что и другой, так что попробуйте кое-что :). Тем не менее, что-нибудь об этом диспетчере событий поможет, я посмотрю, смогу ли я найти больше информации об этом. Это только часть, на которой я застрял сейчас. - person Joseph Astrahan; 30.03.2017
comment
Как передать объект диспетчера событий ресурсам http и websocket? - person Joseph Astrahan; 30.03.2017
comment
Тем временем я читаю это сейчас, все еще новое для подписчиков событий, но очень интересное (symfony. com/doc/current/components/event_dispatcher.html) - person Joseph Astrahan; 30.03.2017
comment
У меня это работает! большое спасибо :), ваши идеи были прекрасны. Я покажу, как я реализовал это в своем другом ответе, обязательно отдав вам должное здесь. - person Joseph Astrahan; 30.03.2017