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

时间:2017-03-12 17:19:48

标签: php symfony real-time ratchet reactphp

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

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

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

您对使用哪种技术及其原因有何建议? (如果你有教程链接我可以!)

提前感谢您的回答!

2 个答案:

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

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

答案 1 :(得分:0)

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