请帮我澄清一些困惑。
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的经验。
有关此的任何信息将不胜感激。
答案 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从服务器移到客户端。