1.Task_worker_num
配置task进程的数量,配置此参数后将会启用task功能。所以swoole_server务必要注册onTask/onFinish2个事件回调函数。如果没有注册,服务器程序将无法启动。
function onTask(swoole_server $serv, int $task_id, int $src_worker_id, mixed $data);
/*
$task_id是任务ID,由swoole扩展内自动生成,
用于区分不同的任务。$task_id和$src_worker_id组合起来才是全局唯的,
不同的worker进程投递的任务ID可能会有相同
$src_worker_id来自于哪个worker进程
$data 是任务的内容
*/
void onFinish(swoole_server $serv, int $task_id, string $data)
/*
$task_id是任务的ID
$data是任务处理的结果内容
task进程会通过swoole_server->finish()方法将任务处理的结果发送给worker进程
*/
例如
Task_worker_num = 100
Task 任务池中,能够创建100个Task 处理任务.
可以制定要给投递给哪个task进程,传入ID即可,范围是0 - (serv->task_worker_num -1)
Task异步的进程
TaskWaitMulti并发多个Task进程
$tasks[] = mt_rand(1000, 9999); //任务1
$tasks[] = mt_rand(1000, 9999); //任务2
$tasks[] = mt_rand(1000, 9999); //任务3
var_dump($tasks);
//等待所有Task结果返回,超时为10s
$results = $serv->taskWaitMulti($tasks, 10.0);
if (!isset($results[0])) {
echo "任务1执行超时了\n";
}
if (isset($results[1])) {
echo "任务2的执行结果为{$results[1]}\n";
}
if (isset($results[2])) {
echo "任务3的执行结果为{$results[2]}\n";
}
Taskwait 阻塞的进程
<?php
$serv = new swoole_server("127.0.0.1", 9501);
$serv->set(array(
'worker_num' => 4,
'daemonize' => false,
'dispatch_mode'=>2,
'task_worker_num'=>100,
));
//启动服务器
$serv->on('start',function ($serv) { //服务器启动回调
echo "+++++++启动了一个SWOOLE++++++++";
});
//服务器启动的Worker进程
$serv->on('WorkerStart',function ($serv,$worker_id){
//echo $worker_id."Worker\n";
});
$serv->on('connect', function ($serv, $fd){ // 客户端链接服务器回调
echo "\n====================================\n";
foreach($serv->connections as $k=>$v)
{
var_dump($k,$v);
}
echo "====================================\n";
});
$serv->on('receive', function ($serv, $fd, $from_id, $data) {//接收到来自客户端信息的回调
$serv->tick(10000, function() use ($serv, $fd) {
/* $serv->task("taskcallback", -1, function (swoole_server $serv, $task_id, $data) use($fd) {
var_dump($task_id, $data);
$serv->send($fd, $serv->worker_id."task");
});*/
$ob = $serv->task("进行一次异步");
$serv->send($fd, $serv->worker_id."task");
});
});
$serv->on('close', function ($serv, $fd) {//关闭于客户端的链接回调
echo "ID=".$fd.":一个链接关闭了.\n";
});
//task 回调
$serv->on('task',function ($serv,$task_id,$src_worker_id,$data){
echo "创建了一个task\n";
$serv->finish($data);
});
//task 任务完成回调
$serv->on('finish',function ($serv,$task_id,$data){
echo $data."->>>>>由finish完成传递\n";
});
$serv->start();//运行服务