Swoole 实例二(Task功能)

直接上代码

服务端代码(server.php)

<?php
/*
 swoole Task运行实例
 Task简介
 Swoole的业务逻辑部分是同步阻塞运行的,如果遇到一些耗时较大的操作,例如访问数据库、广播消息等,就会影响服务器的响应速度。因此Swoole提供了Task功能,将这些耗时操作放到另外的进程去处理,当前进程继续执行后面的逻辑.
 运行Task,需要在swoole服务中配置参数 task_worker_num,即可开启task功能。此外,必须给swoole_server绑定两个回调函数:onTask和onFinish。这两个回调函数分别用于执行Task任务和处理Task任务的返回结果。
*/

class server
{
	private $serv;

	/**
	 * [__construct description]
	 * 构造方法中,初始化 $serv 服务
	 */
	public function __construct() {
		$this->serv = new swoole_server(‘0.0.0.0‘, 9501);
		//初始化swoole服务
		$this->serv->set(array(
			‘worker_num‘  => 8,
			‘daemonize‘   => false, //是否作为守护进程,此配置一般配合log_file使用
			‘max_request‘ => 1000,
			‘log_file‘    => ‘./swoole.log‘,
			‘task_worker_num‘ => 8
		));

		//设置监听
		$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->on("Task", array($this, ‘onTask‘));
		$this->serv->on("Finish", array($this, ‘onFinish‘));

		//开启 
		$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
        );
        // start a task
        $serv->task(json_encode($param));

        echo "Continue Handle Worker\n";
	}

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

	public function onTask($serv, $task_id, $from_id, $data) {
		echo "This Task {$task_id} from Worker {$from_id}\n";
        echo "Data: {$data}\n";
        for($i = 0 ; $i < 2 ; $i ++ ) {
            sleep(1);
            echo "Task {$task_id} Handle {$i} times...\n";
        }
        $fd = json_decode($data, true);
        $serv->send($fd[‘fd‘] , "Data in Task {$task_id}");
        return "Task {$task_id}‘s result";
	}

	public function onFinish($serv,$task_id, $data) {
        echo "Task {$task_id} finish\n";
        echo "Result: {$data}\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", 9501 , 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->send($msg);
        });
    }

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

    public function onError() {

    }

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

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

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

}

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

运行服务端: php server.php

运行客户端: php client.php

结果:

服务端

客户端:

时间: 2024-10-02 23:07:51

Swoole 实例二(Task功能)的相关文章

Json转换利器Gson之实例二-Gson注解和GsonBuilder

有时候我们不需要把实体的所有属性都导出,只想把一部分属性导出为Json. 有时候我们的实体类会随着版本的升级而修改. 有时候我们想对输出的json默认排好格式. ... ... 请看下面的例子吧: 实体类: [java] view plaincopy import java.util.Date; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public 

PHP+swoole实现聊天群发功能

本篇文章主要介绍PHP+swoole实现聊天群发功能,感兴趣的朋友参考下,希望对大家有所帮助. php代码: $serv = new swoole_websocket_server("127.0.0.1",3999); //服务的基本设置 $serv->set(array( 'worker_num' => 2, 'reactor_num'=>8, 'task_worker_num'=>1, 'dispatch_mode' => 2, 'debug_mode

AVOS Cloud 学习笔记(二) 功能总结(What it can do?)

AVOS Cloud 学习笔记(一)   功能总结(What it can do?) 第一章.对象存储 对象新建.保存.更新.删除和检索 1 //创建新对象,根据类名 2 AVObject *gameScore = [AVObject objectWithClassName:@"GameScore"]; 3 [gameScore setObject:[NSNumber numberWithInt:1337] forKey:@"score"]; 4 [gameScor

DWR入门实例(二)

DWR(Direct Web Remoting) DWR is a Java library that enables Java on the server and JavaScript in a browser to interact and call each other as simply as possible. Dwr能让在服务器端的java代码和浏览器客户端的javascript代码尽可能简单的相互调用. DWR is Easy Ajax for Java!  官网:http://d

Hibernate实例二

Hibernate实例二 一.测试openSession方法和getCurrentSession方法 hebernate中可以通过上述两种方法获取session对象以对数据库进行操作,下面的代码以及注解是对两种方法的辨析 SessionTest.java 1 import java.sql.Connection; 2 import java.sql.SQLException; 3 import java.util.Date; 4 5 import org.hibernate.Session; 6

Linux DNS的主从服务器配置实例(二)

在主DNS服务器运行正常的情况下,在另外的一台与之相同的服务器上配置从DNS服务器:操作如下: 我们这里创建DNS从服务器是实验,没有注册,,实际工作中需要注册才能正常使用,明白!!嘻嘻你懂得! 从服务器配置前提调试:(网络必须相同,小孩都知道的!)  1.统一时间  #ntpdate 172.16.0.1 -----指定时间服务器地址(瞬间跟新时间)  #corntab -e----------------------计划任务可以设置定期更新   */3 * * * * /sbin/ntpda

c#事件实例二

c#事件实例二 事件驱动程序与过程式程序最大的不同就在于,程序不再不停地检查输入设备,而是呆着不动,等待消息的到来,每个输入的消息会被排进队列,等待程序处理它.如果没有消息在等待, 则程序会把控制交回给操作系统,以运行其他程序. 操作系统只是简单地将消息传送给对象,由对象的事件驱动程序确定事件的处理方法.操作系统不必知道程序的内部工作机制,只是需要知道如何与对象进行对话,也就是如何传递消息. 先来看看事件编程有哪些好处. 1.使用事件,可以很方便地确定程序执行顺序. 2.当事件驱动程序等待事件时

C语言库函数大全及应用实例二

原文:C语言库函数大全及应用实例二                                              [编程资料]C语言库函数大全及应用实例二 函数名: bioskey 功 能: 直接使用BIOS服务的键盘接口 用 法: int bioskey(int cmd); 程序例: #i nclude #i nclude #i nclude #define RIGHT 0x01 #define LEFT 0x02 #define CTRL 0x04 #define ALT 0x0

WPF中的多进程(Threading)处理实例(二)

原文:WPF中的多进程(Threading)处理实例(二) 1 //错误的处理 2 private void cmdBreakRules_Click(object sender, RoutedEventArgs e) 3 { 4 Thread thread = new Thread(UpdateTextWrong); 5 thread.Start(); 6 } 7 8 private void UpdateTextWrong() 9 { 10 txt.Text = "Here is some n