128 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| /**
 | ||
|  * WebSocket服务端类
 | ||
|  * User: fantasticbin
 | ||
|  * Date: 2020/1/15
 | ||
|  */
 | ||
| class Ws
 | ||
| {
 | ||
|     const HOST = '0.0.0.0';
 | ||
|     const PORT = 8080;
 | ||
| 
 | ||
|     public $server = null;
 | ||
| 
 | ||
|     public function __construct()
 | ||
|     {
 | ||
|         // 创建WebSocket服务器,监听本机的所有地址并监听 8080 端口
 | ||
|         $this->server = new Swoole\WebSocket\Server(self::HOST, self::PORT);
 | ||
| 
 | ||
|         // 设置响应html文件模式以及定义路径
 | ||
|         $this->server->set([
 | ||
|             'worker_num' => 2,
 | ||
|             'task_worker_num' => 2,
 | ||
|             'enable_static_handler' => true,
 | ||
|             'document_root' => dirname(dirname(__FILE__)) . '/Template'
 | ||
|         ]);
 | ||
| 
 | ||
|         // 监听客户端握手成功
 | ||
|         $this->server->on('Open', [$this, 'onOpen']);
 | ||
|         // 监听客户端发送消息
 | ||
|         $this->server->on('Message', [$this, 'onMessage']);
 | ||
|         // 监听task任务执行
 | ||
|         $this->server->on('Task', [$this, 'onTask']);
 | ||
|         // 监听task任务完成
 | ||
|         $this->server->on('Finish', [$this, 'onFinish']);
 | ||
|         // 监听关闭
 | ||
|         $this->server->on('Close', [$this, 'onClose']);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 监听客户端握手成功
 | ||
|      * @param $ws Swoole\WebSocket\Server WebSocket对象
 | ||
|      * @param $request object 请求对象
 | ||
|      */
 | ||
|     public function onOpen($ws, $request)
 | ||
|     {
 | ||
|         echo 'A new websocket client is connected, this client id is ' . $request->fd . PHP_EOL;
 | ||
|         // 每隔10秒执行定时器,向服务端输出信息
 | ||
|         Swoole\Timer::tick(10000, function ($timer_id) {
 | ||
|             echo "waiting client send message. this timer id is " . $timer_id . PHP_EOL;
 | ||
|         });
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 监听客户端发送消息
 | ||
|      * @param $ws Swoole\WebSocket\Server WebSocket对象
 | ||
|      * @param $frame object 客户端数据对象
 | ||
|      */
 | ||
|     public function onMessage($ws, $frame)
 | ||
|     {
 | ||
|         echo "Receive from {$frame->fd} : {$frame->data}, opcode : {$frame->opcode}, fin : {$frame->finish}" . PHP_EOL;
 | ||
|         $data = [
 | ||
|             'name' => 'neo',
 | ||
|             'age' => 30
 | ||
|         ];
 | ||
|         // 投递task任务
 | ||
|         $ws->task($data);
 | ||
| 
 | ||
|         // 延时执行定时器,指定5秒后给客户端发送消息
 | ||
|         Swoole\Timer::after(5000, function () use ($ws, $frame) {
 | ||
|             echo '5s-timer-after.' . PHP_EOL;
 | ||
|             $ws->push($frame->fd, 'message_after-push, this time is ' . date('Y-m-d H:i:s'));
 | ||
|         });
 | ||
| 
 | ||
|         // 给客户端立即推送消息
 | ||
|         $ws->push($frame->fd, 'message-push-success, this time is ' . date('Y-m-d H:i:s'));
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 监听task任务执行
 | ||
|      * @param $serv Swoole\WebSocket\Server WebSocket对象
 | ||
|      * @param $task_id int task任务ID
 | ||
|      * @param $worker_id int worker进程ID
 | ||
|      * @param $data array 传递的数据
 | ||
|      * @return string 执行结果
 | ||
|      */
 | ||
|     public function onTask($serv, $task_id, $worker_id, $data)
 | ||
|     {
 | ||
|         // 打印传递过来的数据
 | ||
|         var_dump($data);
 | ||
|         // 模拟耗时场景,执行10秒
 | ||
|         sleep(10);
 | ||
|         // 告诉worker结果
 | ||
|         return 'on task finish.';
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 监听task任务完成
 | ||
|      * @param $serv Swoole\WebSocket\Server WebSocket对象
 | ||
|      * @param $task_id int task任务ID
 | ||
|      * @param $data string onTask执行完返回的结果
 | ||
|      */
 | ||
|     public function onFinish($serv, $task_id, $data)
 | ||
|     {
 | ||
|         echo "Finish task id: {$task_id}" . PHP_EOL;
 | ||
|         echo "Finish data message: {$data}" . PHP_EOL;
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 监听关闭
 | ||
|      * @param $ws Swoole\WebSocket\Server WebSocket对象
 | ||
|      * @param $client_id int 客户端连接ID
 | ||
|      */
 | ||
|     public function onClose($ws, $client_id)
 | ||
|     {
 | ||
|         echo "client-{$client_id} is closed" . PHP_EOL;
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 启动WebSocket服务器
 | ||
|      */
 | ||
|     public function start()
 | ||
|     {
 | ||
|         $this->server->start();
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| $webSocket = new Ws();
 | ||
| $webSocket->start(); | 
