0

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

我和我最好的朋友谷歌一起查看了很多文档,但我没有找到非常详细的文章。

我想要一些更面向 PHP 的东西,并看到有 ReactPHP / Ratchet 之类的技术(但我找不到足够清晰的教程将其集成到现有的 symfony 项目中)。

您对使用哪些技术以及为什么使用有任何建议?(如果你有我拿的教程链接!)

预先感谢您的回答!

4

2 回答 2

1

每个有用的 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. src/Server.php仅用于演示目的,可以随时替换为 HTTP 服务器。为了保持演示简单,它使用单个 WebSocket 进程,但可以如上所述进行更改。您可以启动php bin/serverphp bin/worker,然后使用telnet localhost 2000来连接和发送消息。它将以相同的消息进行响应,但base64在工作人员中进行了编码。

上面提到的演示是基于Amp构建的,但同样的概念也适用于 ReactPHP。

于 2017-03-14T10:25:00.080 回答
0

In this issue of the official Symfony repository you may find comments and ideas about this: https://github.com/symfony/symfony/issues/17051

于 2017-03-12T17:56:49.453 回答