我只是想澄清(在您的帮助下)之间的联系:PHP + Redis + Node.js + Sockets。
为此,我将以下项目作为基本示例:
https://github.com/biswassampad/Realtime-Chat-With-Laravel5.6-and-Socket.io
这个例子是一个非常基本的聊天应用程序。
这里有一个演示视频:https://www.youtube.com/watch?v=AMgYpjFXnWo
我把它下载到本地,运行良好。
我注意到它使用了:PHP + Redis + Node.js + Sockets。
我想分析我创建并粘贴在下面的不同图表,您可以在以下 url 上找到它们(如果您愿意,可以编辑它们并通过以下方式导出工作表链接:https://shorturl.at,然后将新图像和/或链接粘贴到该线程)。
图 1:
问题 1:能否请您告诉我上图是否正确,或者我是否混淆/遗漏了相关内容?该图表基于本文开头引用的 GitHub 项目。
图 2:
问题 2:如果我们摆脱 Redis 会怎么样? Node.js 可以创建套接字、广播消息等,如您在以下文档中所见:
Redis 的关键特性 是什么让每个人都推荐它用于此类项目。
图 3:
问题 3: 为什么不能在服务器端使用 PHP/Apache 做所有事情? PHP 不可能像 Node.js 一样打开套接字吗? Node.js 有什么魔力而 PHP 没有?
[编辑 1]
问题 4:
关于以下教程:
https://medium.com/@adnanxteam/how-to-use-laravel-with-socket-io-e7c7565cc19d
这也是关于PHP + Redis + Node.js + Sockets,他们使用:laravel-echo-server。
为什么上面的GitHub示例工程上没有使用那个插件?
最佳答案
问题一
我相信你的图表是正确的,但我不知道是否有一些细节错误。尽管对我来说,这就是全部想法。
问题二
Redis 是用于存储消息的数据库。
我认为最好使用它,因为它速度快(因为数据是在内存 (RAM) 中存储/查询的)。尽管我认为您也可以使用其他数据库(MySQL 等)。
如果您删除 Redis,您将在哪里存储数据(例如,要广播的消息)?
问题三
在当前上下文中,Node.js 等同于 Apache;不是 PHP。
现在,Apache 运行您的 PHP 代码(Laravel 项目),而 Node.js 运行您的 JavaScript 代码(Socket.IO)。
我认为您也可以实现 Socket.IO 的 PHP 变体;它将在一个单独的实例中运行。它可能不受欢迎,或者像其他所有问题一样,有更好的工具可以提供更好的解决方案。
通过谷歌搜索,PHP 将不是广播消息的糟糕解决方案,因为它是阻塞的,这意味着它会先完成当前请求,然后再转到下一个请求。另一方面,Node.js 是非阻塞的。
来自维基百科:https://en.wikipedia.org/wiki/Node.js
The biggest difference between Node.js and PHP is that most functions in PHP block until completion (commands execute only after previous commands finish), while Node.js functions are non-blocking (commands execute concurrently or even in parallel, and use callbacks to signal completion or failure).
免责声明:我不是这个领域的专家。我的回答是基于一些谷歌搜索的经验。
关于php - 了解 : PHP + Redis + Node. js + 套接字之间的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53076537/
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成
一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我