php swoole 心跳,聊聊swoole的心跳

来自:桶哥的一篇关于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中文网,转载请注明出处,感谢您的尊重!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 查询 投影,MySql-连接查询

连接查询Chloe 友好支持多表连接查询,一切都可以用 lambda 表达式操作,返回类型可以是自定义类型,也可以是匿名类型。强类型开发,编译可见错误,容错率高。1.建立连接:var user_city_province context.Quer…

php 递归栏目名叠加,thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法,thinkphp递归...

thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法,thinkphp递归本文实例讲述了thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法。分享给大家供大家参考,具体如下:这里使用thinkphp递归循环栏目按照树形结构无限极输出&#…

php cannot call constructor,安装ECshop普遍问题的解决方法

安装时的问题:1.Strict Standards: Non-static method cls_image::gd_version() should not be called statically in /usr/local/httpd2/htdocs/upload/install/includes/lib_installer.php on line 31解决:找到install/includes/lib_installer.php中的…

wind试用版 matlab,免费产品试用 - MATLAB Simulink

请选择其一AlabamaAlaska美属萨摩亚APO/FPO AAAPO/FPO AEAPO/FPO APArizonaArkansasCaliforniaCaroline IslandsColoradoConnecticutDelawareDistrict of ColumbiaFlorida格鲁吉亚关岛HawaiiIdahoIllinoisIndianaIowaKansasKentuckyLouisianaMaineMariana Islands马绍尔群岛Mar…

php yii2 sns,GitHub - yggphpcoder/iisns: 基于 yii2 的 sns 社区系统,一站式解决社区建站...

iisns - 地球村入口iiSNS 是基于 yii2 的 SNS 社区系统,一站式解决社区建站。可以写文章,做记录,上传图片,论坛聊天等。还可以用来做内容管理系统(CMS)。iiSNS 是一个免费的开源项目,在 MIT 许可证下授权发布。特点与功…

php mvc 商城,基于MVC框架的小型网上商城设计

2.本人对课题任务书提出的任务要求及实现预期目标的可行性分析基于MVC框架的小型网上商城实现的功能:商品的浏览、查询、购买,会员注册以及会员订单的查询等,方便商场活动,该系统基本实现了网上商城的应有功能。该系统…

php 做更新进度条,PHP exec()后更新Bootstrap进度条

我使用PHP来运行一个python脚本,并且在脚本执行后需要更新一个进度条。进度条更新后,将执行另一个脚本,依此类推。这里是我的代码如此的票价。我试图用JavaScript来实现。它没有解决Button Textif (isset($_POST[turn])){exec("sudo pyt…

zblog php和asp功能,ZBlog是否适合PHP或ASP?我们该如何选择?

我最近玩了zblog一段时间,对于大多数第一次联系zblog的博客,他们会问zblog是否适合PHP或ASP?我们该如何选择?事实上,我真的不明白这个问题。我个人更喜欢PHP。今天我将整理出来并对PHP版本和ASP版本进行比较&#xff0…

php js记住密码功能,jquery.cookie.js实现用户登录保存密码功能的方法_jquery

本文实例讲述了jquery.cookie.js实现用户登录保存密码功能的方法。分享给大家供大家参考,具体如下:需要导入的js有jquery.js和jquery.cookie.js在页面加载时首先尝试获取cookie的值,如果cookie有值,则将获取到的值填入输入框中&am…

oracle dbf 超大,oracle 数据库users01.dbf文件过大 转移方法

如果出现 linux 拒绝错误,可以把目录权限 该为777由于在安装的时候将Oracle安装到了C盘,表空间也创建到了C盘(当时没有在意),等项目进行到了中期,发现C盘的空间不够用了。此时,一个较好的解决办法就是将表空间的文件转…

oracle中exists连接两个表,IN、EXISTS、多表连接,哪个速度更快

本帖最后由 ghsau 于 2011-10-11 23:39 编辑请看下面三个执行计划(Oracle10g)1. 用INSQL> select ename from emp e where e.deptno in (select d.deptno from dept d where d.dnameSALES);PLAN_TABLE_OUTPUT------------------------------------------------------------…

php决策管理,报表管理与数据分析:为系统未来发展规划提供决策依据,有效避免IT管理与投资的盲目??...

据了解,很多中大型企事业单位的IT基础结构具有复杂、分散等特征,并且信息化程度越高,数据类型越繁杂,数据量也越庞大。许多单位不得不付出极大的人力、物力对网络进行管理。而一个单位的信息化的程度和IT部门的服务水平&#xff0…

oracle迁移undo表空间,oracle切换undo表空间

Oracle里的回滚表空间在数据库使用一段时间后,undo表空间的dbf文件往往会增长到比较大,这个时候我们需要切换undo表空间1.新建undo表空间SQL> create undo tablespace undotbs2 datafile /data/undotbs02.dbf size 10M autoextend on next 10M ;2.由于…

pppoe linux 配置文件,linux PPPOE服务端配置

查看pppo服务器安装包pm -qa | grep pppoe 可以看到系统中pppoe server安装包rpm -ql rp-pppoe-3.5-2 查看该安装包安装信息(如安装路径,配置文件等),如果有信息输出,你可以看到这一行:/sbin/pppoe-serverps -e | grep pppoe-serve 查看pppoe服务有没有运行,如果没有,则启动: p…

设置linux拨号服务端,CentOS Linux上搭建PPPoE服务器及拨号设置

CentOS下PPPoE拨号设置1.查看并安装拨号软件:[rootRedHat ~]# rpm -qa|grep pppoe[rootredhat ~]# yum -y install rp-pppoerp-pppoe.i686 0:3.10-8.el62.查看adsl-setup命令所在位置:[rootredhat ~]#whereis adsl-setupadsl-setup:或者直接搜索pppoe信息…

Linux原始网络编程,Linux操作系统网络编程 原始套接字 (1)

Linux操作系统网络编程--原始套接字 (1)http://soft.zdnet.com.cn/software_zone/2007/1020/568223.shtml我们在前面已经学习过了网络程序的两种套接字(SOCK_STREAM,SOCK_DRAGM).在这一章 里面我们一起来学习另外一种套接字--原始套接字(SOCK_RAW)。应用原始套接字,我们可以编写…

linux上pyenv卸载,在Ubuntu 18.04系统下安装pyenv的方法

本文介绍在Ubuntu 18.04操作系统下安装pyenv的方法,使用它可以进行Python多版本管理,目的是防止不同的Python版本因为不兼容而出现错误。安装pyenv其实非常的简单,只需要在系统终端中运行一条命令即可,以下是操作方法,…

linux防火墙作用是什么,Linux防火墙操作1

什么是防火墙防火墙可通过监测、限制、更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息、结构和运行状况,以此来实现网络的安全保护。简单来讲 就是防止外界通过网络攻击Linux服务器的一个软件本次学习目标:防火墙的启停&#xff0…

linux中touch命令的作用,Linux中touch命令的作用是什么

今天微子网络向你展示了触摸命令在Linux中的功能。内容简洁易懂,一定会让你眼前一亮。希望通过这篇文章的详细介绍,你能有所收获。linux的Touch命令不常用,但在使用make时可能会用到,make用于修改文件时间戳或创建一个不存在的新文…

linux打jar包xml文件,springboot打jar包部署外置配置文件

一、读取配置文件的优先级默认:Jar包同级目录的config目录Jar包同级目录classPath(即resources目录)的config目录classpath目录最高优先级的方式是项目启动时通过命令的方式指定项目加载核心配置文件,命令如下java –jar xxxx.jar -Dspring.config.locat…