<?php
class Ws{
const HOST = '0.0.0.0'; // 监听的IP地址, 0.0.0.0 表示监听所有IP地址
const PROT = '9504';
public $ws = null; // 存放websocket连接资源
public $config = [
// 进程数
'worker_num' => 2,
// Task 进程的数量
'task_worker_num' => 2,
];
public function __construct()
{
// 创建 websocket server对象
$this->ws = new swoole\websocket\server(self::HOST, self::PROT);
// 设置参数
$this->ws->set($this->config);
// 监听websocket连接事件
$this->ws->on('open', [$this, 'onOpen']);
// 监听websocket消息事件
$this->ws->on('message', [$this, 'onMessage']);
// 向 task_worker 进程投递新的任务
$this->ws->on('task', [$this, 'onTask']);
// 异步任务执行成功时调用
$this->ws->on('finish', [$this, 'onFinish']);
// 监听websocket连接关闭事件
$this->ws->on('close', [$this, 'onClose']);
// 启动服务
$this->ws->start();
}
/**
* 监听websocket连接事件
* @param $ws
* @param $request
*/
public function onOpen($ws, $request)
{
var_dump($request->fd);
}
/**
* 监听websocket消息事件
* @param $ws
* @param $frame
*/
public function onMessage($ws, $frame)
{
echo '消息:'. $frame->data. PHP_EOL;
// 投放异步任务
$data = [
'task' => 1,
'fd' => $frame->fd
];
$ws->task($data);
// 发送消息给客户端
$ws->push($frame->fd, '这是服务端发送的消息:'. date('Y-m-d H:i:s'));
}
/**
* 向 task_worker 进程投递新的任务
* @param $server Swoole\Server 对象
* @param $taskId 执行任务的 task进程id
* @param $workerId 投递任务的 worker进程id
* @param $data 任务的数据内容
*/
public function onTask($server, $taskId, $workerId, $data)
{
var_dump('任务开始了'. json_encode($data));
// 耗时场景 10s
sleep(10);
return 'task任务完成了';
}
/**
* 异步任务执行成功时调用
* @param $server Swoole\Server 对象
* @param $taskId 执行任务的 task 进程 id
* @param $data 任务处理的结果内容
*/
public function onFinish($server, $taskId, $data)
{
echo '任务id: '. $taskId. PHP_EOL;
echo 'finish message: '. $data. PHP_EOL;
}
/**
* 监听websocket连接关闭事件
* @param $ws
* @param $fd
*/
public function onClose($ws, $fd)
{
echo '退出了:'. $fd. PHP_EOL;
}
}
new Ws();
注:Task 任务是非阻塞的,执行完毕会立即返回。
使用 Task 功能,必须先设置 task_worker_num。
并且必须设置 Server 的 onTask 和 onFinish 事件回调函数。