来自:桶哥的一篇关于swoole的心跳的文章,作为Swoole顾问(顾得上就问,是为「顾问」)得推一下这篇文章,最后只留下一配置,其实我也不是太明白原理,我在想如果是局域网里还需要心跳?

——————————————————————————————————————————————————————————————————————

swoole提供了一个心跳的功能,很多朋友感到困惑。

心跳是什么?

顾名思义,心跳是判断一个事物生还是死的一个标准,在swoole里,心跳是指用来判断一个连接是正常还是断开的。

从TCP协议说起

我们都知道一个五元组标识一个网络连接,创建一个连接有三次握手,而断开一个连接有四次挥手。不管是服务器还是客户端

发起连接的关闭,都会完整的走完四次挥手的过程,这样,一切很完美,系统回收这个fd,应用层也可以通过onClose回调处理相关的事情.

fd是什么?

fd学名是文件描述符,在unix的哲学就是一切皆文件中,这个fd就是系统层暴露给业务层的用来表示一个五元组网络连接的标识。你可以简单的理解为一个索引,通过对这个fd的操作,系统层可以找到相应的连接而且进行的一系列操作,如发送数据到网瞳,进行连接关闭等等。

为什么要心跳?

刚才提到,如果我们要关闭某个连接,我们可以在业务层对fd发起关闭连接的操作,以swoole为例:

$server->close($fd);

正常情况下,都会走完整个四次挥手,(swoole会有onClose回调),系统回收fd,以待分配给其他的连接。

那系统为什么要回收fd,因为fd资源是有限的,所以必需重复利用。

但在某些情况下,如突然拔掉网线或蓝翔演习挖断光缆,服务端并不能感知到这个连接的异常,但实际上是这个连接已经失效了,如果没有一个回收机制,这类连接将用光所有的fd,导致系统不再能接受新的连接请求,所以就有了心跳机制。

什么是心跳机制?

心跳机制就是业务层来提供一个连接是否存活的一个方法,让系统能判定一个连接是否失效。一般有两种实现方式:

1: 客户端定时发送一个心跳包,告诉服务器我还活着,服务器定时检测所有客户端列表,看他们最后一个心跳包的时间是否过长,如果过长,则认为已无心跳,判定为死连接,主动关闭这个连接。

2: 服务器定时询问所有的客户端,你们还活着么?如果活着,给我个回馈,没得到回馈的客户端,格杀勿论。

两种心跳方案有什么区别?

第一种方案,对服务器和网络的压力更小,而且更具有灵活性,但需要客户端配合定时发送心跳包。

第二种方案,对服务器和网络压力更大,不建议使用。

心跳在swoole里的实现

swoole采用的是第一种方案

swoole会在主进程独立起一个心跳线程,通过定时轮询所有的连接,来判断连接的生死,所以swoole的心跳不会堵塞任何业务逻辑。

那怎么判断连接的生死了?swoole在connection结构体中有 time_t last_time 字段,用来存放最后一次收包的时间戳,进而通过与这个时间对比来判定是否存活

于是,swoole有两个配置:

heartbeat_check_interval: 服务器定时检测在线列表的时间

heartbeat_idle_time: 连接最大的空闲时间 (如果最后一个心跳包的时间与当前时间之差超过这个值,则认为该连接失效)

配置建议

建议 heartbeat_idle_time 为 heartbeat_check_interval 的两倍多一点。

这个两倍是为了进行容错,允许丢一个包

而多一点是考虑到网络的延时。

你可以跟据实际的业务来调整这个容错率(允许丢几个包)。

补充

1、系统层面也提供心跳机制,只不过粒度相对比较粗,而且时间稍长,没有应用层灵活

2、swoole还提供ping的功能,通过配置ping值,swoole内核可以判断只是一个心跳包,而不会,也没必要把数据包转发应用层(onReceive)。

3、心跳不只是swoole独有,大多数tcp的网络服务都会考虑到这个问题

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php swoole 心跳,聊聊swoole的心跳相关推荐

  1. swoole实现Timer定时器、心跳检测及Task进阶实例:mysql连接池

    2019独角兽企业重金招聘Python工程师标准>>> Table of Contents 1.Timer定时器 2.心跳检测 3.Task进阶:MySQL连接池 环境说明: 系统: ...

  2. php 心跳检测,Swoole 实例四(心跳检测)

    服务器端 server.php<?php /* Swoole已经内置了心跳检测功能,能自动close掉长时间没有数据来往的连接. 而开启心跳检测功能,只需要设置heartbeat_check_i ...

  3. php心跳检测实时数据,心跳检测 · swoole手册 · 看云

    # 心跳 注意:长链接应用必须加心跳,否则链接可能由于长时间未通讯被路由节点强行断开. 心跳作用主要有两个: 1.客户端定时给服务端发送点数据,防止连接由于长时间没有通讯而被某些节点的防火墙关闭导致连 ...

  4. swoole client php,Swoole Client

    PHP常用socket创建TCP连接,使用CURL创建HTTP连接,为了简化操作,Swoole提供了Client类用于实现客户端功能,并增加了异步非阻塞模式,让用户在客户端也能使用事件循环. 作为客户 ...

  5. socket心跳机制图片_WebSocket心跳检测和重连机制

    1. 心跳重连原由 心跳和重连的目的用一句话概括就是客户端和服务端保证彼此还活着,避免丢包发生. websocket连接断开有以下两种情况: 前端断开 在使用websocket过程中,可能会出现网络断 ...

  6. socket心跳机制图片_socket心跳包机制

    心跳包 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包 心跳包的作用 网络中的接收和发送数据都是使用SOCKET进行实现.但 ...

  7. laravel swoole mysql_Laravel集成Swoole教程

    1.准备工作 安装 Laravel laravel new laravel-swoole 本人使用 valet 进行开发,可以使用 laravel-swoole.test 进行访问 2.引入 swoo ...

  8. php swoole编译,php+swoole+redis源码编译安装

    tar -zxvf php-7.2.4.tar.gz cd php-7.2.4 ./configure --prefix=/usr/local/php make && make ins ...

  9. 心跳检测以及应用层心跳包机制设计

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501(嵌入式方向) QQ交流群:856398158(后端方向) 目录 心跳检测应用场 ...

最新文章

  1. Swing 实现聊天系统 私发与群发
  2. C# 一个操作Oracle的简易工具类(通过System.Data.OracleClient)
  3. HDU 3501 Calculation 2
  4. c/c++ 编译器内存对齐问题
  5. TWRP-recovery中文界面安装方法[转]
  6. 计算机里有个不能进入的磁盘分区,新电脑只有一个分区怎么办? 教你们如何不进pe给硬盘创建新分区!...
  7. TFN推出2.5G传输分析仪D240S 等待您来验证
  8. PC机组成——主板、芯片组与BIOS
  9. 华为usg系列防火墙-密码重置
  10. 【论文翻译 AAAI 2020 | 知识图谱综述】A Survey on Knowledge Graphs: Representation, Acquisition and Applications
  11. Python贪吃蛇双人大战
  12. 1t硬盘怎么分区最好_1TB的硬盘如何分区比较合理?
  13. maximo 入门知识
  14. 5e连不上服务器如何修改Dns,Ubuntu 18.04 永久修改DNS的方法
  15. 职场的技术人如何做好一个公众号?
  16. CAJ未授权用户在此计算机,笔记本提示未授予用户在此计算机上的请求登陆类型怎么办...
  17. JAVA小游戏有源代码,非常详细的注释,以及自己做的答辩PPT
  18. Windows10任务栏图标变白色解决方法
  19. 请求数据应该放在Created还是Mounted
  20. 官方代付系统/支付宝微信代付/企业付款/提现秒到

热门文章

  1. Java native方法availableProcessors()获取处理器数量的底层C++实现
  2. 初始化java工具失败,“初始化 Java 工具”期间发生了内部错误, java.lang.NullPointerException...
  3. java短信验证码功能发送的验证码如何校验_企业如何选择短信平台才能保障安全和稳定性?...
  4. tcp分包传图片 如何还原_技术控丨超详细解析TCP重传机制
  5. python保存为excel文件_初级Python:在excel文件打开时保存它
  6. php mysql5.7.110安装教程_MYSQL教程mysql5.7.19 winx64安装配置方法图文教程(win10)
  7. d0...while循环结构讲解
  8. android 主流分辨率是多少,android 屏幕分辨率问题
  9. api demo 京东商品详情_jd-demo
  10. linux 扩展挂载盘大小_Linux 添加挂载硬盘(包含挂载大于2T以上硬盘)