服务端代码:
<?php
$serv = new \Swoole\Server('127.0.0.1', 9501);
//设置异步任务的工作进程数量。
$serv->set([
'task_worker_num' => 4,
// 'open_eof_split' => true,
// 'package_eof' => "|||"
]);
//此回调函数在worker进程中执行。
$serv->on('Receive', function($serv, $fd, $reactor_id, $data) {
// echo ' [ '.$reactor_id.' ]'.$data;
$data = json_decode($data, true);
print_r($data['content'] );
foreach($data['content'] as $name => $sql){
$serv->task(json_encode([$name => $sql]));
}
//投递异步任务
// $task_id = $serv->task($data);
// echo "Receive: Dispatch AsyncTask: id={$task_id}\n";
});
//处理异步任务(此回调函数在task进程中执行)。
$serv->on('Task', function ($serv, $task_id, $reactor_id, $data) {
$data = json_decode($data, true);
foreach($data as $name => $sql){
// print_r($data);
// echo '['.$task_id.' task start '. microtime(true).'] ';
$res = Db::query($sql);
// echo '['.$task_id.' task end '.microtime(true).' ]';
print_r($res);
echo '|'.$reactor_id.'|';
$serv->send( $reactor_id, json_encode([$name => $res]));
$serv->finish(json_encode([$name => $res]));
}
//返回任务执行的结果
// $serv->finish("{$data}->OK1");ss
});
//处理异步任务的结果(此回调函数在worker进程中执行)。
$serv->on('Finish', function ($serv, $task_id, $data) {
// echo "Finish: AsyncTask[{$task_id}] Finish: {$data}".PHP_EOL;
// $serv->send($task_id, 'PONG!!!');
});
$serv->start();
}
客户端代码:
<?php
$client = new Swoole\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9501, -1)) {
exit("connect failed. Error: {$client->errCode}\n");
}
$client->send("hello world\n");
echo $client->recv();
$client->close();
在服务端代码中,由于向task中添加的任务执行时间不固定,所以如果早于服务端recv数据,就会报错,这个问题可以如何解决呢?