小白来请教一下,长连接是什么,是不是所有的长链接之后都是 while(true)来获得消息?

2021-01-08 11:04:45 +08:00
 pinews
最近在看消息队列,有的用 while true,有的用事件,不知道事件背后是不是也是 while true,这个是正常情况吗,所有语言都是这样吗?
4537 次点击
所在节点    PHP
27 条回复
julyclyde
2021-01-08 11:08:56 +08:00
第一,请不要写 ture
Renco
2021-01-08 11:11:13 +08:00
同有这个疑问
Ranying
2021-01-08 11:15:10 +08:00
@julyclyde 请问这是什么原理?
qiayue
2021-01-08 11:17:08 +08:00
@Ranying 就是不要写 ture 的原理
justfun
2021-01-08 11:27:46 +08:00
@Ranying 不要写 ture 要写 true 原理(这笑话真够冷的...
pinews
2021-01-08 11:32:41 +08:00
好像是这样,不知道说的对不对,TCP 建立连接后,发送一条信息,就等待对方的回应,如果对方的回应中有“结束连接”,就关闭连接,短连接默认是带“结束连接”的,为了在程序执行完,按顺序接下来要发送“结束连接”之前用一个 while true 阻塞接下来的行为。

php cgi 也就是 web 按 http 协议默认是执行完就要回应对方。
cli 是本身是个长连接?没超时限制,没自动结束连接?

在 php 程序请求其他 socket 加了 p 就是长连接,但默认有超时,为了超时要设置 socket 超时为不限时,如果不加 p 就是一次性的?

不知道对不对。。。什么都是在摸索。。。
pinews
2021-01-08 11:35:52 +08:00
对了 php 有个 ignore_user_abort,可以让浏长时间执行的程序在浏览器停止关闭之后继续执行。
Rheinmetal
2021-01-08 11:40:33 +08:00
其实总是要有地方做轮询的
无非是你自己写 还是标准库 协议栈 网卡硬件来做的问题
不自己写 while true 是怕出死循环而已
Jooooooooo
2021-01-08 11:41:13 +08:00
看起来是定时的功能总是有人在轮询

最后是这个轮询谁做的问题
b1ackjack
2021-01-08 11:44:38 +08:00
@justfun 谢谢,有被笑到 hhhhhh
RedBeanIce
2021-01-08 11:46:04 +08:00
请了解 websocket
wysnylc
2021-01-08 11:46:18 +08:00
@justfun #5 已经分不清 ture true 哈哈哈哈
yolee599
2021-01-08 11:51:32 +08:00
事件是不阻塞的,应用事件一般是由一个单独的线程处理完成后发送,底层事件是由硬件中断发送的
togou
2021-01-08 12:03:25 +08:00
长连接就是连接复用 ,没数据包过来的时候 就看 heartbeat 没 heartbeat 就维护定时器踢掉
soulzz
2021-01-08 13:29:54 +08:00
建议了解下 NIO
soulzz
2021-01-08 13:30:43 +08:00
以及 epoll
lqw3030
2021-01-08 14:04:52 +08:00
tcp 没有长短链接的区分,所谓 keep-alive 都是应用层上的,你可以本地验证下,本地建立一个到本地的连接,能坚持到 2022 年都不断开
Ranying
2021-01-08 16:01:36 +08:00
@justfun @qiayue 自闭了,没有看出来。
la2la
2021-01-08 16:02:32 +08:00
不要从字面上理解长连接,tcp 长连接跟现实世界上用一个绳子把两端连接起来不一样,可以理解 tcp 连接的两端都在自身维持了一个数据结构也可以说是一种状态,只要这个状态不被改变,那两端发包收包都没有问题,看起来就跟连接起来一样,只要一端的状态改变了,就不能正常的接受发送包了,也就是断开连接了,换句话说,如果不可考虑计算机资源的话,维持一个永久的维持这个状态
la2la
2021-01-08 16:12:58 +08:00
就跟两个人通过信件进行交流一样,假设每个信件只能写一个字,两个人交流需要很多封信,每个人就是写信到纸上(应用层),封上信封(传输层-端口),信封上写上地址(网络层-ip ),丢给邮差(数据链路-网线或者光纤等等)。你在发一封信的时候,根本不知道这个信会不会到达该到的地方,所以需要三次握手来确认双方都收到了。这个时候两个人都记住了,我们两个人在交流,只要你不忘,也就是一直都是长连接,但是只要双方一人不回信或者忘了这个状态,这个连接就算失效了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/742874

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX