最近我在开发Laravel聊天练手项目的时候,也阅读了一些关于websockets和像Pusher、Socket.io这样的SaaS的资料。但是我不明白的是,为什么我们需要外部软件来建立websocket连接?难道像Vue.js这样的前端框架和Laravel这样的后端代码不能直接建立连接吗?为什么必须要通过像Pusher和Socket.io这样的中间人呢?对于这个问题,望多多包涵,谢谢。
最近我在开发Laravel聊天练手项目的时候,也阅读了一些关于websockets和像Pusher、Socket.io这样的SaaS的资料。但是我不明白的是,为什么我们需要外部软件来建立websocket连接?难道像Vue.js这样的前端框架和Laravel这样的后端代码不能直接建立连接吗?为什么必须要通过像Pusher和Socket.io这样的中间人呢?对于这个问题,望多多包涵,谢谢。
它并不一定需要。
那些软件碎片只是让使用Websocket协议变得容易而已。
请记住,Laravel是一个“有偏见”的框架。这意味着它会选择自己的库来为您抽象化这些概念,以便您不必过多地担心底层发生了什么。
基本上,你需要两个组件才能够使用Websockets:
Laravel之所以不能直接使用Websockets与前端进行通信,是因为Laravel本身并不是一个Websocket服务器。至少不完全是。虽然PHP确实支持使用Websocket协议甚至有一些库可以更好地利用它, 但它并没有像其他语言那样经常用于处理长期运行的进程。
相反,Laravel使用Redis提供的发布/订阅功能来监听通过Redis和Predis库发生的事件。它这样做的原因是因为Laravel更适合作为websocket服务器和所有连接的客户端之间的中间人。缺点是现在你必须知道如何管理和维护这个过程,以便Websocket服务器每次重启服务器时都会开启,或者如果发生故障等情况。
查看PM2,了解更多有关运行和维护服务器守护程序的信息。
如果您不同意Laravel关于如何处理Websockets的观点,那么理论上您可以使用任何其他服务器端语言来处理websocket协议。只需要更深入地了解协议本身;如果Laravel需要与其一起工作,则必须知道如何编写适当的服务和提供程序类来处理它。
简单回答?你不需要使用它们。尽管编写你自己的服务端和客户端websocket实现。
更长的回答。
为什么要使用Laravel?我可以直接使用PHP完成所有操作。
为什么要使用Vue?我可以用vanilla javascript完成所有操作。
我们使用库和框架是因为它们抽象了实现细节,使产品构建变得更容易。它们处理你没有想到或根本不知道的边缘情况,因为他们被数千或数百万开发人员使用,并且所有他们遇到并修复的知识和错误都已融入到实现中。
这是软件工程的标志之一,“代码重用”。不要重复自己,不要编写你不必编写的任何软件。它允许你专注于为你特定的要求构建解决方案,而不是在甚至在构建解决方案之前就专注于构建大量基础设施。
我从未使用过Pusher,但它看起来像一个SaaS产品。不过Socket.io是开源的。