2017-02-19 122 views
0

请帮我澄清一些混淆。为什么使用redis进行websocket通信?

Laravel允许与socket.io通信具有您设置的Redis:

https://laravel.com/docs/5.4/broadcasting#configuration

据我了解的Redis只需持有类似memcached的内存大一些的数据?这允许socket.io等第三方软件获取数据。这真的是websocket行为吗?

我知道,你也可以做这样的事情在PHP中:

$address = 'localhost'; 
$port = 5600; 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
socket_connect($socket, $address, $port); 

他们为什么不选择上面的东西而不是你设置的Redis的?这可能是一个很好的答案,但我对Redis或websocket没有太多的经验。

任何信息,将不胜感激。

+0

您发布的代码不是websocket代码,它是用于正常套接字的。我假设PHP对于websocket并不是很好,这就是他们这样做的原因。 –

+0

我已经拿到了这段代码:https://gonzalo123.com/2012/10/08/how-to-send-the-output-of-symfonys-process-component-to-a-node-js-服务器在实时与插座io /所以我想它仍然工作。我仍然想知道他们为什么选择redis。我想可能会有负面影响,但我不熟悉它们。很想听听有关这方面的专家意见。 –

回答

1

您需要考虑连接的持久性。 Laravel的一个请求只能在获得响应的时间内存活。一旦响应被发回,应用程序关闭,直到一个新的请求到达index.php并且Laravel再次启动。

所以实际上,你不能以这种方式建立持久连接。例如,Socket.io将允许您连接到服务并保持连接。这是Rest和Websocket方法的主要区别。在Rest界面中,客户端不断地轮询服务器......所以如果你有1000个客户端,你就有1000个讨厌的小客户端询问你是否每30秒钟有新东西......最多也就是烦人的。但每次他们问,Laravel都会经历整个启动/关机过程......没有任何东西是持久的。

现在,当通过Node服务使用Socket.io时,每个客户端都将连接到Node实例(这是一个单独的持久线程......更适合这个) 1000个客户端,客户只需听新的插座...

当一个Laravel请求创建一个1000客户端感兴趣的事件时,它只是将信息推送到Redis队列...节点实例从Redis队列中读取并且可以向连接到1000的客户端广播,因为它已经保持连接...

这是一个非常好用的PHP和Node技术,因为它强调了s两者的强度...

希望这会有所帮助...

+0

我发布的这段代码是为了打开一个套接字来捕获shell命令运行时的执行输出。这意味着我的PHP不会'自杀',并且会一直存在直到完成这个过程。否则,我甚至无法在shell执行输出的第一行之后记录任何内容。在这种情况下,虽然不需要像Redis这样的东西?这只会让一个人获得shell执行的实时输出。欢呼的方式回答,帮助。 –

+0

自杀PHP ..大声笑PHP将运行完成,在Laravel请求生命周期中,响应发送后应用程序关闭。当然,如果你保存它以后再做其他事情,那么它将继续存在,或者如果你开始另一个过程。在PHP中做并不是不可能的,它只需要持久性。现在,如果您将自己收到的每个请求都保存在自己的进程中,则不会扩展。节点是一个处理所有连接的单线程,而不是每个线程一个连接...当所有连接需要发送(广播)相同的事情时,简化读取持久队列... – Serge

+1

另外,在您有多个请求将事件推送到队列中(Laravel请求诞生了,发送消息,然后死掉),那么您需要像Redis这样的排队机制来确保您不会丢失任何消息,因为Websocket处理过程可能会被淹没,并且可能无法服务器实时发送Socket。这可以防止创建一个阻塞调用来从短暂的Laravel请求过程发送...自然而然,您可以在一个客户端脚本中摆脱许多事情......但这是总体思路以及为什么在此上下文中使用Redis/Node ... 希望这可以帮助 – Serge

相关问题