Swoole 实例四(心跳检测)

服务器端 server.php

<?php
/*
Swoole已经内置了心跳检测功能,能自动close掉长时间没有数据来往的连接。
而开启心跳检测功能,只需要设置heartbeat_check_interval和heartbeat_idle_time即可。如下:
$this->serv->set(
    array(
        ‘heartbeat_check_interval‘ => 60,
        ‘heartbeat_idle_time‘ => 600,
    )
);
其中heartbeat_idle_time的默认值是heartbeat_check_interval的两倍。 
在设置这两个选项后,swoole会在内部启动一个线程
每隔heartbeat_check_interval秒后遍历一次全部连接,检查最近一次发送数据的时间和当前时间的差
如果这个差值大于heartbeat_idle_time,则会强制关闭这个连接,并通过回调onClose通知Server进程。 
小技巧: 
结合之前的Timer功能,如果我们想维持连接,就设置一个略小于如果这个差值大于heartbeat_idle_time的定时器,在定时器内向所有连接发送一个心跳包。
如果收到心跳回应,则判断连接正常,如果没有收到,则关闭这个连接或者再次尝试发送。
*/

class server
{
	private $serv;

	/**
	 * [__construct description]
	 * 构造方法中,初始化 $serv 服务
	 */
	public function __construct() {
		$this->serv = new swoole_server(‘0.0.0.0‘, 9801);
		//初始化swoole服务
		$this->serv->set(array(
			‘worker_num‘  => 8,
			‘daemonize‘   => 0, //是否作为守护进程,此配置一般配合log_file使用
			‘max_request‘ => 1000,
			‘dispatch_mode‘ => 2,
			‘debug_mode‘ => 1,
			‘log_file‘    => ‘./swoole.log‘,
			‘heartbeat_check_interval‘ => 5,
			‘heartbeat_idle_time‘ => 8, //默认是heartbeat_check_interval的2倍,超过此设置客户端没有回应则强制断开链接
		));

		//设置监听
		$this->serv->on(‘Start‘, array($this, ‘onStart‘));
		$this->serv->on(‘Connect‘, array($this, ‘onConnect‘));
		$this->serv->on("Receive", array($this, ‘onReceive‘));
		$this->serv->on("Close", array($this, ‘onClose‘));
		//开启
		$this->serv->start();
	}

	public function onStart($serv) {
		echo SWOOLE_VERSION . " onStart\n";
	}

	public function onConnect($serv, $fd) {
		echo $fd."Client Connect.\n";
	}

	public function onReceive($serv, $fd, $from_id, $data) {
		echo "Get Message From Client {$fd}:{$data}\n";
		// send a task to task worker.
        $param = array(
            ‘fd‘ => $fd
        );
      
        $serv->send($fd, ‘Swoole: ‘.$data);
	}

	public function onClose($serv, $fd) {
		echo $fd."Client Close.\n";
	}

}

$server = new server();

客户端 client.php

<?php
class Client
{
    private $client;

    public function __construct() {
        $this->client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
        $this->client->on(‘Connect‘, array($this, ‘onConnect‘));
        $this->client->on(‘Receive‘, array($this, ‘onReceive‘));
        $this->client->on(‘Close‘, array($this, ‘onClose‘));
        $this->client->on(‘Error‘, array($this, ‘onError‘));
    }

    public function connect() {
        if(!$fp = $this->client->connect("127.0.0.1", 9801 , 1)) {
            echo "Error: {$fp->errMsg}[{$fp->errCode}]\n";
            return;
        }
    }

    //connect之后,会调用onConnect方法
    public function onConnect($cli) {
        fwrite(STDOUT, "Enter Msg:");
        swoole_event_add(STDIN,function(){
            fwrite(STDOUT, "Enter Msg:");
            $msg = trim(fgets(STDIN));
            $this->client->send($msg);
        });
    }

	public function onReceive($cli, $data) {
		echo "Received: ".$data."\n";
	}

    public function onClose($cli) {
        echo "Client close connection\n";
    }

    public function onError() {

    }

    public function send($data) {
        $this->client->send($data);
    }

    public function isConnected() {
        return $this->client->isConnected();
    }

}

$client = new Client();
$client->connect();

运行:

php server.php

php client.php

时间: 2024-10-28 13:50:19

Swoole 实例四(心跳检测)的相关文章

Netty实践(四):心跳检测实现

心跳检测的概念 在分布式架构中,比如Hadoop集群,Storm集群等,或多或少都涉及到Master/Slave的概念,往往是一个或者多个Master和N个Slave之间进行通信.那么通常Master应该需要知道Slave的状态,Slave会定时的向Master进行发送消息,相当于告知Master:"我还活着,我现在在做什么,什么进度,我的CPU/内存情况如何"等,这就是所谓的心跳.Master根据Slave的心跳,进行协调,比如Slave的CPU/内存消耗很大,那么Master可以将

Netty之心跳检测技术(四)

Netty之心跳检测技术(四) 一.简介 "心跳"听起来感觉很牛X的样子,其实只是一种检测端到端连接状态的技术.举个简单的"栗子",现有A.B两端已经互相连接,但是他们之间很长时间没有数据交互,那么A与B如何判断这个连接是否可用呢?我们通常的做法就是,让任何一方,例如我们让A端,定时的发送(例如每5秒钟)一句问候"Are you ok?",如果B都到来自A的问候,回了一句"GUN",A收到了来自B的信息,也不在乎B到底给我回了

Swoole 心跳检测

Swoole的心跳检测特别简单,只需要配置 heartbeat_check_interval,heartbeat_idle_time就可以了. heartbeat_check_interval:表示服务器隔几秒检测超时.要小于heartbeat_idle_time. heartbeat_idle_time 表示超多少时间就会断开 示例代码演示了,5s检测,如果有10s内未向服务器端发送数据,将会被切断 <?php date_default_timezone_set('Asia/Shanghai'

EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~再续~添加对各只读服务器的心跳检测

回到目录 上一讲中基本实现了对数据库的读写分离,而在选择只读数据库上只是随机选择,并没有去检测数据库服务器是否有效,如服务器挂了,SQL服务停了,端口被封了等等,而本讲主要对以上功能进行一个实现,并对配置文件也进行了一些优化,让它更好的支持多个数据库服务器,分别配置各个的账号和密码及数据库服务端口等等,接下来,就来看一下主要的代码吧. 一 配置文件 <!-- ef实现对sql读写分离的配置,sqlserver端采用发布与订阅实现 --> <add key="readDb&quo

Swoole 实例三(Timer定时器)

server.php <?php  /*  Swoole已经内置了心跳检测功能,能自动close掉长时间没有数据来往的连接. 而开启心跳检测功能,只需要设置heartbeat_check_interval和heartbeat_idle_time即可.如下: $this->serv->set(     array(         'heartbeat_check_interval' => 60,         'heartbeat_idle_time' => 600,   

websocket-heartbeat-js心跳检测库正式发布

前言: 两年前写了一篇websocket心跳的博客——初探和实现websocket心跳重连.  阅读量一直比较大,加上最近考虑写一个自己的npm包,因此就完成了一个websocket心跳的检测库.在这里先感谢几个提供帮助的大佬朋友们,小弟受益匪浅. 介绍 websocket-heartbeat-js基于浏览器js原生websocket封装,主要目的是保障客户端websocket与服务端连接状态.该程序有心跳检测及自动重连机制,当网络断开或者后端服务问题造成客户端websocket断开,程序会自动

1、微服务--为什么有consul,consul注册,心跳检测,服务发现

一.为什么有consul? 在微服务,每1个服务都是集群式的,订单服务在10台服务器上都有,那么用户的请求到达,获取哪台服务器的订单服务呢?如果10台中的有的订单服务挂了怎么办?10台服务器扛不住了,水平扩展又新增加了1台服务器提供订单服务,怎么让用户请求知道有新的服务器提供服务了?这时候就需要Consul了,它能通过心跳检测哪些服务还活着,而且有新的服务启动,它也能主动发现 二.consul环境准备 1.consul环境 consul官网:https://www.consul.io/downl

android4.0 USB Camera实例(四)CMOS

上一篇说了下usb camera uvc标准的 顺便把CMOS做到一起 操作上基本一至 上一篇HAL层里我已经提供了CMOS的相关接口 JNIEXPORT jint JNICALL Java_com_dao_usbcam_Fimcgzsd_yuvtorgb 如果使用和UVC一样的处理 图像显示不出来 所以用另外一种方法 同时这里使用的是斯道ICOOL210开发板测试的 如果使用CMOS还需要修改一些地方 HAL层修改如下 首先增加一个函数如下 int select_input(int input

jQuery插件实例四:手风琴效果[无动画版]

手风琴效果就是内容的折叠与打开,在这个插件中,使用了三种数据来源:1.直接写在DOM结构中:2.将数据写在配置项中:3.从Ajax()中获取数据.在这一版中,各项的切换没有添加动画效果,在下一版中会是有动画效果的. 在这个插件中,CSS和JS的配置非常重要,需要特别注意.另外,加个思考,请先看完后再想这个问题:当点击其中某项时,给width直接添加animate是否合适,当快速在其上移动时,如何保证效果? 效果图预览 插件JS accordionB.js 1 ; 2 (function ($,