如何从 PHP 服务器而非 Javascript 连接到 Websocket 服务器
How to connect to Websocket Server from PHP Server NOT Javascript
我是 运行 棘轮网络套接字服务器。由于一些复杂的情况,我需要能够通过我的PHP服务器实时而不是Javascript与这个websocket服务器通信,以便能够向它发送信息然后将稍后传递给连接到它的任何客户端。
我在 Whosebug 上四处看了看,但一切都是关于如何使用 PHP 创建 websocket 服务器,这不是我要找的。
下面是我要实现的目标的视觉效果。
这里的关键是如何使用 PHP?
连接到 ratchet 之类的 Websocket 服务器
我有的东西tried/considered:
我考虑过使用序列化方法。这将在数据库中序列化和反序列化。不知道这个比这个方法好不好,请指教
这是我开始的地方:
我建议使用 REST 作为 API 层来在您的 Symfony 应用程序和 Ratchet 应用程序之间进行通信。因为从你的 Symfony 应用程序使用 Websocket 没有多大意义。 Websockets 用于双向实时通信,而您只需要从 Symfony 应用程序发送一段数据。为此,HTTP REST API 会更方便。
总结一下,在您的 Ratchet 应用程序中,您使用 2 个服务器(Ratchet 允许在单个应用程序中创建任意数量的服务器):web-socket 服务器和 http-server。在您的 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();
How do I pass the information from the http server to the websocket server?
React/Ratchet 应用程序是一个事件驱动的应用程序,就像典型的 NodeJS 应用程序一样。因此,应用程序组件相互通信的最佳方式是 dispatch/subscribe 事件。例如,您创建 $eventDispatcher
对象,将其传递给每个组件(http-handler 和 ws-handler),然后使用 $eventDispatcher->subscibe(eventName, func)
和 $eventDispatcher->emit(eventName, data)
订阅事件并相应地调度它们。
如果你不服气,那么你需要使用一个Websocket客户端库来连接到Websocket服务器。有几个,就google吧。我个人从未使用过 PHP websocket-client 库,所以我不推荐任何。
我是 运行 棘轮网络套接字服务器。由于一些复杂的情况,我需要能够通过我的PHP服务器实时而不是Javascript与这个websocket服务器通信,以便能够向它发送信息然后将稍后传递给连接到它的任何客户端。
我在 Whosebug 上四处看了看,但一切都是关于如何使用 PHP 创建 websocket 服务器,这不是我要找的。
下面是我要实现的目标的视觉效果。
这里的关键是如何使用 PHP?
连接到 ratchet 之类的 Websocket 服务器我有的东西tried/considered:
我考虑过使用序列化方法。这将在数据库中序列化和反序列化。不知道这个比这个方法好不好,请指教
这是我开始的地方:
我建议使用 REST 作为 API 层来在您的 Symfony 应用程序和 Ratchet 应用程序之间进行通信。因为从你的 Symfony 应用程序使用 Websocket 没有多大意义。 Websockets 用于双向实时通信,而您只需要从 Symfony 应用程序发送一段数据。为此,HTTP REST API 会更方便。 总结一下,在您的 Ratchet 应用程序中,您使用 2 个服务器(Ratchet 允许在单个应用程序中创建任意数量的服务器):web-socket 服务器和 http-server。在您的 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();
How do I pass the information from the http server to the websocket server?
React/Ratchet 应用程序是一个事件驱动的应用程序,就像典型的 NodeJS 应用程序一样。因此,应用程序组件相互通信的最佳方式是 dispatch/subscribe 事件。例如,您创建 $eventDispatcher
对象,将其传递给每个组件(http-handler 和 ws-handler),然后使用 $eventDispatcher->subscibe(eventName, func)
和 $eventDispatcher->emit(eventName, data)
订阅事件并相应地调度它们。
如果你不服气,那么你需要使用一个Websocket客户端库来连接到Websocket服务器。有几个,就google吧。我个人从未使用过 PHP websocket-client 库,所以我不推荐任何。