为什么使用redis进行websocket通信?

时间:2017-02-19 21:50:16

标签: php node.js laravel sockets

请帮我澄清一些困惑。

Laravel允许您通过设置redis来与socket.io进行通信:

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或websockets的经验。

有关此的任何信息将不胜感激。

2 个答案:

答案 0 :(得分:6)

你需要考虑连接的持久性。 Laravel中的请求仅存在于获得响应所需的时间。一旦发回响应,应用程序将关闭,直到新的请求到达index.php并再次启动Laravel。

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

现在,当通过Node服务使用Socket.io时,每个客户端都会连接并与Node实例保持连接(这是一个持久的线程......更适合这个)...有了这个连接到1000个客户端,客户端只需听取套接字的新内容......

当Laravel请求创建一个1000个客户端感兴趣的事件时,它只是将信息推送到Redis队列...... Node实例从Redis队列中读取并可以维护到已连接的1000个客户端连接...

它充分利用了PHP和Node技术,因为它突出了两者的优势......

希望这会有所帮助......

答案 1 :(得分:0)

我刚才也遇到了同样的问题,现在我会试着回答你的问题。这会让您的服务器变为无状态或 websocket 无状态。例如:服务器实例崩溃,该服务器中的所有套接字都已销毁。客户端将打开到另一个服务器实例的新连接。帮助新服务器了解客户想要什么数据。每个新连接都需要包含一些要发送的额外消息。 channel name, sessionId, roomId etc.它和JWT非常相似,密码或者channel或者sessionId从服务器移到客户端。