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,
    )
);
其中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‘,
		));

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

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

	public function onWorkerStart( $serv , $worker_id) {
		// 在Worker进程开启时绑定定时器
        echo $worker_id ." onWorkerStart \n";
        // 只有当worker_id为0时才添加定时器,避免重复添加
        if( $worker_id == 0 ) {
        	$serv->addtimer(1000);//毫秒数
	        $serv->addtimer(3000);
            $serv->addtimer(10000);
        }
    }

	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";
	}

	public function onTimer($serv, $interval) {
    	switch( $interval ) {
    		case 1000: {	// 
    			echo "Do Thing A at interval 500\n";
    			break;
    		}
    		case 3000:{
    			echo "Do Thing B at interval 3000\n";
    			break;
    		}
    		case 10000:{
    			echo "Do Thing C at interval 10000\n";
    			break;
    		}
    	}
    }
}

$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

可以看到结果:

时间: 2024-10-08 13:31:14

Swoole 实例三(Timer定时器)的相关文章

Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLink : NSObject { @private void *_impl; //指针 } + (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel;//唯一一个初始化方法 - (void)addToRunLoop:(NS

duilib 界面库 实现timer定时器

看了大神介绍的duilib感觉已被同龄人狠狠地甩在背后.所以痛下决心,之后要多花时间写代码. 大神教程传送门: http://www.cnblogs.com/Alberl/p/3341956.html 现在的问题是想基于duilib实现一个timer定时器.工程基础大概是在 http://www.cnblogs.com/Alberl/p/3343763.html 因为自己的东西是基于大神的东西写的,所以要把大神的教程看得差不多才知道我在说什么.O(∩_∩)O~~ 前台大概长这个样子: 稍微修改了

cocos2dx三种定时器的使用

 cocos2dx三种定时器的使用以及停止schedule,scheduleUpdate,scheduleOnce 今天白白跟大家分享一下cocos2dx中定时器的使用方法. 首先,什么是定时器呢?或许你有时候会想让某个函数不断的去执行,或许只是执行一次,获取你想让他每隔几秒执行一次,ok,这些都可以统统交给定时器来解决. cocos2dx中有三种定时器:schedule,scheduleUpdate,scheduleOnce.了解其功能便会发现定时器真是太方便了,废话不多说,我们逐一学习一

Timer 定时器

Timer是一个经常使用的东西,它有3种类型的Timer.分别是: 1.定义在System.Windows.Forms里: 2.定义在System.Threading.Timer类里: 3.定义在System.Timers.Timer类里: ◆System.Windows.Forms.Timer 应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API  SetTimer实现的.它的主要缺点是计时不精确,而且必须有消息循环,Con

cocos2dx三种定时器使用

 cocos2dx三种定时器的使用以及停止schedule.scheduleUpdate.scheduleOnce 今天白白跟大家分享一下cocos2dx中定时器的用法. 首先,什么是定时器呢?也许你有时候会想让某个函数不断的去运行.也许仅仅是运行一次,获取你想让他每隔几秒运行一次.ok.这些都能够统统交给定时器来解决. cocos2dx中有三种定时器:schedule,scheduleUpdate.scheduleOnce.了解其功能便会发现定时器真是太方便了,废话不多说,我们逐一学习一下

C#三种定时器的实现

·关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Timers.Timer类里 System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中 的Timer控件,内部使用API SetTimer实现的.它的主要缺点是计时不精确,而且必须有消息循环,Console Appli

JAVA之Timer定时器

1.原理 JDK中,定时器任务的执行需要两个基本的类:java.util.Timer;java.util.TimerTask; java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks.一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建. 要运行一个定时任务,最基本的步骤如下:1.建立一个要执行的任务TimerTask.2.创建一个Timer实例,通过Timer提供的sched

第二十八(线程的同步、守护线程、Timer 定时器)

/* 模拟ATM取款,不是线程同步机制,多线程同时对一个账户进行操作 t1 和 t2 异步编程模型:t1线程执行t1,t2线程执行的是t2,两个线程之间谁也不等于谁 同步编程模型:t1线程和t2线程执行,当t1线程必须等于t2的线程执行结果之后,t1线程才能执行 这是同步编程模型. 什么时候需要引入同步 1. 为了数据安全,尽管应用程序的使用率低,但是为了保证数据安全性,必须的加入线程同步机制 线程同步机制 使程序变成了(等同)单线程 2. 在什么条件下需要使用线程同步 <1> 必须是多线程环

C#中WebService 的 Timer定时器过段时间后自动停止运行

我用.net做的一个Timer定时器,定时获取短信并给予回复,但大概过了十几个小时以后,Timer定时器会自动停止,再发送短信就不能收到回复,需要在服务器中重新运行定时器才可以,请教各位! 我是在.net framework中的,有一个Global.asax全局应用程序文件,帖代码:public class Global : System.Web.HttpApplication { double iTimerInterval; System.Timers.Timer timer = new Sy