我想知道是否有人可以向我解释如何使用Symfony构建实时应用程序?
我和我最好的朋友谷歌一起看了很多文档,但我没有找到相当详细的文章。
我想要一些更面向PHP的东西,看到有像ReactPHP / Ratchet这样的技术(但我找不到足够清晰的教程将它集成到现有的symfony项目中)。
您对使用哪种技术及其原因有何建议? (如果你有教程链接我可以!)
提前感谢您的回答!
答案 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/server
和php bin/worker
,然后使用telnet localhost 2000
来连接和发送消息。它将使用相同的消息进行响应,但base64
在工作人员中编码。
上述演示基于Amp构建,但同样的概念也适用于ReactPHP。
答案 1 :(得分:0)
在本期Symfony官方存储库中,您可以找到有关此问题的评论和想法:https://github.com/symfony/symfony/issues/17051