1
julyclyde 2021-01-08 11:08:56 +08:00
第一,请不要写 ture
|
2
Renco 2021-01-08 11:11:13 +08:00
同有这个疑问
|
6
pinews OP 好像是这样,不知道说的对不对,TCP 建立连接后,发送一条信息,就等待对方的回应,如果对方的回应中有“结束连接”,就关闭连接,短连接默认是带“结束连接”的,为了在程序执行完,按顺序接下来要发送“结束连接”之前用一个 while true 阻塞接下来的行为。
php cgi 也就是 web 按 http 协议默认是执行完就要回应对方。 cli 是本身是个长连接?没超时限制,没自动结束连接? 在 php 程序请求其他 socket 加了 p 就是长连接,但默认有超时,为了超时要设置 socket 超时为不限时,如果不加 p 就是一次性的? 不知道对不对。。。什么都是在摸索。。。 |
7
pinews OP 对了 php 有个 ignore_user_abort,可以让浏长时间执行的程序在浏览器停止关闭之后继续执行。
|
8
Rheinmetal 2021-01-08 11:40:33 +08:00
其实总是要有地方做轮询的
无非是你自己写 还是标准库 协议栈 网卡硬件来做的问题 不自己写 while true 是怕出死循环而已 |
9
Jooooooooo 2021-01-08 11:41:13 +08:00
看起来是定时的功能总是有人在轮询
最后是这个轮询谁做的问题 |
11
RedBeanIce 2021-01-08 11:46:04 +08:00
请了解 websocket
|
13
yolee599 2021-01-08 11:51:32 +08:00
事件是不阻塞的,应用事件一般是由一个单独的线程处理完成后发送,底层事件是由硬件中断发送的
|
14
togou 2021-01-08 12:03:25 +08:00
长连接就是连接复用 ,没数据包过来的时候 就看 heartbeat 没 heartbeat 就维护定时器踢掉
|
15
soulzz 2021-01-08 13:29:54 +08:00
建议了解下 NIO
|
16
soulzz 2021-01-08 13:30:43 +08:00
以及 epoll
|
17
lqw3030 2021-01-08 14:04:52 +08:00
tcp 没有长短链接的区分,所谓 keep-alive 都是应用层上的,你可以本地验证下,本地建立一个到本地的连接,能坚持到 2022 年都不断开
|
19
la2la 2021-01-08 16:02:32 +08:00
不要从字面上理解长连接,tcp 长连接跟现实世界上用一个绳子把两端连接起来不一样,可以理解 tcp 连接的两端都在自身维持了一个数据结构也可以说是一种状态,只要这个状态不被改变,那两端发包收包都没有问题,看起来就跟连接起来一样,只要一端的状态改变了,就不能正常的接受发送包了,也就是断开连接了,换句话说,如果不可考虑计算机资源的话,维持一个永久的维持这个状态
|
20
la2la 2021-01-08 16:12:58 +08:00 1
就跟两个人通过信件进行交流一样,假设每个信件只能写一个字,两个人交流需要很多封信,每个人就是写信到纸上(应用层),封上信封(传输层-端口),信封上写上地址(网络层-ip ),丢给邮差(数据链路-网线或者光纤等等)。你在发一封信的时候,根本不知道这个信会不会到达该到的地方,所以需要三次握手来确认双方都收到了。这个时候两个人都记住了,我们两个人在交流,只要你不忘,也就是一直都是长连接,但是只要双方一人不回信或者忘了这个状态,这个连接就算失效了
|
21
pinews OP 哦 感谢大神们
|
22
jeffh 2021-01-08 16:47:18 +08:00 2
以下是个人见解,有问题可以指出。只是大概,不抠细节。
1. 长连接,首先它是连接,是 tcp 的概念而不是 udp,因为 udp 不需建立连接。 2. 长连接的“长”是应用层来维持的,和 tcp 无关。应用层可以使用心跳等机制实现。 3. tcp 建立连接后需要发送 FIN 包才会断掉连接,否则不会断。如果断网了之后一直不联网。tcp 有保活机制,默认 2 小时一次,发送 9 个探针,都没回应的话会断掉连接。 4. 至于 while true 的问题,网卡获取到消息后会发起中断,操作系统调入你的程序运行。 5. 你的 while true 程序做好阻塞或者休眠就行,会释放 CPU 资源 |
24
keepeye 2021-01-08 17:08:01 +08:00
所谓长连接就是不关闭的 TCP 连接,短连接呢就是每个请求都去创建一个新的连接,响应结束后主动 close 掉连接。
|
25
keepeye 2021-01-08 17:14:24 +08:00
php 的 socket 超时时间呢,应该分为连接超时和读超时,这个超时是为了类似防止拔网线等意外情形导致无法获知连接已经失效了,到达超时时间没有收到数据后,主动 close
|
26
xiangbohua 2021-01-08 20:09:20 +08:00
我是这么的理解的。
说长连接的话,应该说的是 TCP 协议的长连接,那就要提到 tcp 连接是怎么连接的了。那么所谓的连接,就是两台电脑(说计算机室不是高大上一点啊)两个进程通过物理信道接受数据了。这里面感觉会牵涉到操作系统怎么样把网卡接收到的数据传给指定的进程输入。 当一个进程通过调用接口告知操作系统,我需要持续接受来自某个端口的时候数据,并且对方计算机表示会持续发送数据的时候我觉得应该就算是建立了长连接吧。 有可能是 while true 也有可能是某种阻塞中断吧。 (聊到这个感觉自己好菜) |
27
nthhdy 2021-01-08 22:12:19 +08:00
@Rheinmetal 基本是的。不过还有,有些地方是硬件中断
|