比如有这样一个需求:前端用户注册表单提交入库,紧接着发送确认邮件,然后赠送积分。
如果这三部分是一个同步
任务,那么用户在前端要等待最后“赠送积分”完成,才能确定自己是否注册成功。
如果是异步
任务,那么我们可以在”用户注册表单提交入库”成功之后,就返回给前端用户。
https://wiki.swoole.com/wiki/page/481.html
1、处理用户注册的swoole服务端代码 user_reg_server.php
<?php
/**
* 这是我们处理用户注册swoole服务代码
*
*/
$serv = new swoole_server("10.211.55.15", 9501);
// 设置异步任务的工作进程数量
$serv->set(array('task_worker_num' => 4));
$serv->on('receive', function($serv, $fd, $from_id, $data) {
if(1){ // if里是伪代码:用户数据入库逻辑
// 如果入库成功,后面2个任务才异步执行
// 投递"发送邮件"这个异步任务
$task_email = $serv->task($data); // 这里的$data 是客户端传递过来的
// 投递"赠送积分"这个异步任务
$task_gif = $serv->task($data);
// 上面2个异步任务成功分发
// 可以给客户端发送一个提示信息
$serv->send($fd, "register success");
}
});
// 处理异步任务
$serv->on('task', function ($serv, $task_id, $from_id, $data) {
// 执行任务的具体代码
echo "New AsyncTask[id=$task_id]".PHP_EOL;
//返回任务执行的结果
return 1; // 在onTask函数中只要return一个字符串或者非null的变量,都表示投递的task已完成
});
// 处理异步任务的结果
$serv->on('finish', function ($serv, $task_id, $data) {
echo "AsyncTask[$task_id] Finish: $data".PHP_EOL;
});
// 开始
$serv->start();
2、客户端用户注册,连接上swoole,传递数据 addUser.php
<?php
/*
* 这是用户注册部分,用户注册逻辑(也就是我们的web网站可能和我们的Swoole服务不在同一台机器上)
* */
$userInfo = ['name'=>'jack','email'=>'[email protected]']; // 这是我们准备传递给swoole服务端的数据
// 创建swoole客户端
$client = new swoole_client(SWOOLE_SOCK_TCP);
if (!$client->connect("10.211.55.15", 9501, -1))
{
exit("connect failed. Error: {$client->errCode}\n");
}
// 发送 用户数据 到服务端
$client->send(json_encode($userInfo));
// 接收服务端返回的内容
echo $client->recv();
// 关闭客户端
$client->close();
开始服务,客户端去连接会很快返回register success
。
服务端打印:
New AsyncTask[id=1]
New AsyncTask[id=0]
AsyncTask[1] Finish: 1
AsyncTask[0] Finish: 1