V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pinews
V2EX  ›  PHP

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

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

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

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

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

    最后是这个轮询谁做的问题
    b1ackjack
        10
    b1ackjack  
       2021-01-08 11:44:38 +08:00
    @justfun 谢谢,有被笑到 hhhhhh
    RedBeanIce
        11
    RedBeanIce  
       2021-01-08 11:46:04 +08:00
    请了解 websocket
    wysnylc
        12
    wysnylc  
       2021-01-08 11:46:18 +08:00
    @justfun #5 已经分不清 ture true 哈哈哈哈
    yolee599
        13
    yolee599  
       2021-01-08 11:51:32 +08:00
    事件是不阻塞的,应用事件一般是由一个单独的线程处理完成后发送,底层事件是由硬件中断发送的
    togou
        14
    togou  
       2021-01-08 12:03:25 +08:00
    长连接就是连接复用 ,没数据包过来的时候 就看 heartbeat 没 heartbeat 就维护定时器踢掉
    soulzz
        15
    soulzz  
       2021-01-08 13:29:54 +08:00
    建议了解下 NIO
    soulzz
        16
    soulzz  
       2021-01-08 13:30:43 +08:00
    以及 epoll
    lqw3030
        17
    lqw3030  
       2021-01-08 14:04:52 +08:00
    tcp 没有长短链接的区分,所谓 keep-alive 都是应用层上的,你可以本地验证下,本地建立一个到本地的连接,能坚持到 2022 年都不断开
    Ranying
        18
    Ranying  
       2021-01-08 16:01:36 +08:00
    @justfun @qiayue 自闭了,没有看出来。
    la2la
        19
    la2la  
       2021-01-08 16:02:32 +08:00
    不要从字面上理解长连接,tcp 长连接跟现实世界上用一个绳子把两端连接起来不一样,可以理解 tcp 连接的两端都在自身维持了一个数据结构也可以说是一种状态,只要这个状态不被改变,那两端发包收包都没有问题,看起来就跟连接起来一样,只要一端的状态改变了,就不能正常的接受发送包了,也就是断开连接了,换句话说,如果不可考虑计算机资源的话,维持一个永久的维持这个状态
    la2la
        20
    la2la  
       2021-01-08 16:12:58 +08:00   ❤️ 1
    就跟两个人通过信件进行交流一样,假设每个信件只能写一个字,两个人交流需要很多封信,每个人就是写信到纸上(应用层),封上信封(传输层-端口),信封上写上地址(网络层-ip ),丢给邮差(数据链路-网线或者光纤等等)。你在发一封信的时候,根本不知道这个信会不会到达该到的地方,所以需要三次握手来确认双方都收到了。这个时候两个人都记住了,我们两个人在交流,只要你不忘,也就是一直都是长连接,但是只要双方一人不回信或者忘了这个状态,这个连接就算失效了
    pinews
        21
    pinews  
    OP
       2021-01-08 16:25:45 +08:00
    哦 感谢大神们
    jeffh
        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 资源
    aJieK
        23
    aJieK  
       2021-01-08 17:00:23 +08:00
    @julyclyde 哈哈哈哈,一开始在想为什么不能写 true,然后再一看,哈哈哈哈,之前犯过很多次了
    keepeye
        24
    keepeye  
       2021-01-08 17:08:01 +08:00
    所谓长连接就是不关闭的 TCP 连接,短连接呢就是每个请求都去创建一个新的连接,响应结束后主动 close 掉连接。
    keepeye
        25
    keepeye  
       2021-01-08 17:14:24 +08:00
    php 的 socket 超时时间呢,应该分为连接超时和读超时,这个超时是为了类似防止拔网线等意外情形导致无法获知连接已经失效了,到达超时时间没有收到数据后,主动 close
    xiangbohua
        26
    xiangbohua  
       2021-01-08 20:09:20 +08:00
    我是这么的理解的。
    说长连接的话,应该说的是 TCP 协议的长连接,那就要提到 tcp 连接是怎么连接的了。那么所谓的连接,就是两台电脑(说计算机室不是高大上一点啊)两个进程通过物理信道接受数据了。这里面感觉会牵涉到操作系统怎么样把网卡接收到的数据传给指定的进程输入。
    当一个进程通过调用接口告知操作系统,我需要持续接受来自某个端口的时候数据,并且对方计算机表示会持续发送数据的时候我觉得应该就算是建立了长连接吧。
    有可能是 while true 也有可能是某种阻塞中断吧。
    (聊到这个感觉自己好菜)
    nthhdy
        27
    nthhdy  
       2021-01-08 22:12:19 +08:00
    @Rheinmetal 基本是的。不过还有,有些地方是硬件中断
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5048 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 09:48 · PVG 17:48 · LAX 01:48 · JFK 04:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.