一.Task
1.工作原理
Worker通过调用task()方法发送数据到Task进程
Task进程会在onTask回调中接收到数据并进行处理
处理完成之后,调用finish函数或者直接ruturn返回给Worker进程
Worker进程在onFinish()函数接收到消息并处理。
2.代码实践
async_server.php
$serv = new swoole_server("127.0.0.1", 9501);
//设置异步任务的工作进程数量
$serv->set(array('task_worker_num' => 4));
$serv->on('receive', function($serv, $fd, $from_id, $data) {
//投递异步任务
$task_id = $serv->task($data);
echo "Dispath AsyncTask: id=$task_id\n";
});
//处理异步任务
$serv->on('task', function ($serv, $task_id, $from_id, $data) {
echo "New AsyncTask[id=$task_id]".PHP_EOL;
//返回任务执行的结果
$serv->finish("$data -> OK");
});
//处理异步任务的结果
$serv->on('finish', function ($serv, $task_id, $data) {
echo "AsyncTask[$task_id] Finish: $data".PHP_EOL;
});
$serv->start();
async_client.php
<?php
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
//注册连接成功回调
$client->on("connect", function($cli) {
$cli->send("hello world\n");
});
//注册数据接收回调
$client->on("receive", function($cli, $data){
echo "Received: ".$data."\n";
});
//注册连接失败回调
$client->on("error", function($cli){
echo "Connect failed\n";
});
//注册连接关闭回调
$client->on("close", function($cli){
echo "Connection close\n";
});
//发起连接
$client->connect('127.0.0.1', 9501, 0.5);
3.Task常见问题
- Task传递数据大小
- 数据小于8k,直接通过管道传递;
- 数据大于8k,写入临时文件传递;
- Task传递对象
- 可以通过序列化传递一个对象的拷贝;
- Task中对对象的改变不会反映到Worker进程中;
- 数据库连接、网络连接对象不可传递;
- Task的onFinish回调
- Task的onFinish回调会回调给调用task方法的Worker进程(原路返回可寻)
二.Timer
- 基于 Reactor线程(在Task Worker中使用系统定时器)
- Timer基于epoll的timeout机制实现
- 使用堆存放Timer,提高检索效率
//每隔2000ms触发一次
swoole_timer_tick(2000, function ($timer_id) {
echo "tick-2000ms\n";
});
//3000秒后执行此函数
swoole_timer_after(3000, function () {
echo "after 3000ms.\n";
});