我最近在浏览我的Laravel聊天练习应用程序时,一直在阅读像Pusher和Socket.io这样的websockets和SaaS。我不明白的是,为什么我们需要外部软件来建立websocket连接?像Laravel这样的服务器代码不能像Vue.js那样直接建立与前端的连接吗?为什么要像Pusher和Socket.io那样经历中间人?抱歉没有问题。
答案 0 :(得分:24)
。
这些软件恰好使得使用Websocket协议变得微不足道。
请记住,Laravel是一个自以为是的框架。这意味着它将挑选和选择自己的库来为你抽象出这些概念,这样你就不用太担心幕后发生的事情。
基本上,为了能够使用Websockets,您需要两个组件:
Laravel没有使用Websockets直接与前端通信的原因是因为Laravel本身并不是Websocket服务器。至少,不是真的。虽然PHP确实支持使用Websocket协议 - and even some libraries to leverage it a little more nicely - 但它并不像其他语言那样经常用于处理长期存在的进程。
相反,Laravel使用Pub/Sub functionality that Redis provides来收听通过Redis和Predis library发生的事件。这样做的原因是因为Laravel更适合作为websocket服务器和所有连接客户端的中间人。
通过这种方式,Laravel既可以使用Broadcasting Events将信息传递到Websocket服务器,也可以从Websocket服务器接收事件信息,并确定用户是否具有接收它们的能力或授权。
如果您不想使用Pusher,那么有一个库可以让您专门为Laravel运行自己的Websocket服务器Laravel Echo Server。
在引擎盖下,该库仍然使用Socket.io和Redis,以便所有移动部件在Laravel Web应用程序中无缝地相互通信。这样做的好处是您不必担心服务器发送的消息数量。
缺点是您现在必须知道如何在服务器上管理和维护此过程,以便Websocket服务器知道每次重新启动服务器时都会打开,或者如果发生故障等等。
查看PM2以了解有关运行和维护服务器守护程序的更多信息。
如果您不同意Laravel关于如何处理Websockets的意见,那么理论上您可以使用任何其他服务器端语言来处理websocket协议。它只需要更多的协议本身的工作知识;如果Laravel需要使用它,您必须知道如何编写适当的Service和Provider类才能处理它。
答案 1 :(得分:11)
简短回答?你不必使用它们。自己编写自己的服务器和客户端websocket实现。
更长的答案。
为什么要使用Laravel?我可以用直接的PHP做到这一切。
为什么要使用Vue?我可以用vanilla javascript完成所有这些。
我们使用库和框架,因为它们抽象了实现的细节并使构建产品变得更容易。他们处理您不会想到的边缘案例或者您甚至不知道您不了解的事情因为他们被成千上万的开发人员和所有人使用他们遇到和修复的知识和错误都被纳入了实施过程。
这是软件工程的标志之一,代码重用。不要重复自己,不要写任何你不必要的软件。它允许您专注于为您的特定需求构建解决方案,而不是在构建解决方案之前专注于构建一堆基础架构。
我从未使用过Pusher,但看起来,是的,它是SaaS产品。但是Socket.io is open source。