实时应用程序 Symfony - 使用什么技术?

Real-time Apps Symfony - What technology to use?

我想知道是否有人可以向我解释如何使用 Symfony 构建实时应用程序?

我和我最好的朋友Google看了很多文档,但是我没有找到很详细的文章。

我想要更多面向 PHP 的东西,看到有像 ReactPHP / Ratchet 这样的技术(但我找不到足够清晰的教程来将它集成到现有的 symfony 中项目)。

对于使用哪些技术以及为什么,您有什么建议吗? (如果你有教程链接我就拿走!)

提前感谢您的回答!

在本期官方 Symfony 存储库中,您可能会找到关于此的评论和想法:https://github.com/symfony/symfony/issues/17051

每个有用的 Symfony 应用程序都做某种形式的 I/O。在传统应用程序中,这通常是阻塞 I/O。即使它是非阻塞的 I/O,它也没有集成全局事件循环,可以在等待 I/O.

时安排其他事情

如果您将 Symfony 集成到现有的基于事件循环的 WebSocket 服务器中,它将使用阻塞 I/O 作为概念证明,但您很快就会注意到它在 运行生产,因为任何阻塞 I/O 都会阻塞整个事件循环,从而阻塞所有其他连接的客户端。

一个解决方案是将所有内容重写为非阻塞 I/O,但这样您就不会再使用 Symfony。您也许可以重用某些组件,但只能重用那些不执行任何操作的组件 I/O.

另一种解决方案是使用 RPC 并将 WebSocket 请求放入队列中。中介只能用非阻塞I/O来写,没什么可做的。它基本上只是将 WebSocket 消息作为 RPC 请求转发到队列。然后你有一组工作人员从该队列中拉出,进行正常的 Symfony 内核分派并将响应发送到响应队列中。然后工作人员可以继续获取下一个工作。

通过第二种解决方案,您可以完全使用阻塞 I/O 和所有现有的 Symfony 组件。您可以根据需要生成任意数量的工作人员,甚至可以在请求之间让它们保持活动状态。中间队列的不同之处在于,一个阻塞工作人员不会阻塞 WebSocket 端点的响应能力。

如果您需要多个 WebSocket 进程,则需要为它们设置单独的响应队列,以便将响应发送回客户端连接的正确进程。

您可以在 kelunik/rpc-demo 中找到使用 BeanstalkD 作为队列的有效实现。 src/Server.php 仅用于演示目的,可以随时替换为 HTTP 服务器。为了使演示简单,它使用单个 WebSocket 进程,但可以按上述方式进行更改。您可以启动 php bin/serverphp bin/worker,然后使用 telnet localhost 2000 连接和发送消息。它将以相同的消息响应,但 base64 在 workers 中编码。

上述演示基于 Amp,但相同的概念也适用于 ReactPHP。