php 用swoole创建一个简单的多房间聊天室

前端代码:




	
	Document
	


	

ws-测试

瑜伽聊天室

当前在线:0


视频id:
房间号:
用户名字:
内容:

后台代码:

我用的是thinkphp5框架做的,在linux执行命令是

php index.php index/swoole_chat/wsServer

view->assign('room', $room);
        $this->view->assign('video_id', $video_id);

		// return $this->fetch('ws_client');
		return $this->fetch('ws_client_s');

	}

    /**我的web**/
    public function wsServer()
    {
    	$server = new \swoole_websocket_server("0.0.0.0", 8659);

    	//房间号room+fd+视频id+用户者userId 

		// 设置配置
		$server->set(
		    array(
		        'daemonize' => false,      // 是否是守护进程
		        'max_request' => 10000,    // 最大连接数量
		        'dispatch_mode' => 2,
		        'debug_mode'=> 1,
		        // 心跳检测的设置,自动踢掉掉线的fd
		        'heartbeat_check_interval' => 5,
		        'heartbeat_idle_time' => 600,
		    )
		);

		$server->on('open', function (\swoole_websocket_server $server, $request) {
		    echo "open\n";
		    $server->push($request->fd, "open");
		});



		//监听消息事件
		$server->on('message', function (\swoole_websocket_server $server, $frame) {
		    echo "message\n";

		    // var data = '{"content":"'+content+'","room":"'+room+'","user":"'+user+'","video_id":'+video_id+'}';

		    //获取到传递的信息
		    $data = $frame->data;
		    $fd = $frame->fd;//识别用户

		    $dataRes = json_decode($data,true);
		    $room_id = $dataRes['room_id'];//房间
		    $video_id = $dataRes['video_id'];//视频id
		    $array = Cache::get('user_info-'.$room_id);
		    $user_name = $dataRes['user_name'];//用户名

		    $type = $dataRes['type'];//用户名
		    // dump($type);
		    //结束蹦年出现die 
		    // if($type == 'login'){
		    // 	echo 1111111111111111;
		    // 	return;
		    // 	// die;
		    // }
		    // print_r($array);
		    if(empty($array)){
		    	$array = array();
		    }
		    
		    $array_key = $fd;//唯一的识别id
		    

		    if(!in_array($array_key, $array)){
		    	//第一次进来,同一房间的把所有的用户都存在一个房间的数组里面 对应关系的  房间 : fd 
		    	$array[] = $array_key;
		        Cache::set('user_info-'.$room_id,$array);

		        //fd-对应者房间号,到时关闭要删除缓存
		        $user_array[] = 'user_info-'.$room_id;
		        Cache::set($array_key,$user_array);

		        // 获取同一个房间的用户
		        $array = Cache::get('user_info-'.$room_id);

		        $data = array(
		        	'content' => $user_name.'进入房间了'.$room_id.'--'.$array_key,
		        	'user_name' => $user_name,
		        	'count' => count($array),
		        	);
		    	foreach ($array as $key => $value) {
		    		// dump($value);
		    		if($server->exist($value)){
		    			$server->push($value,json_encode($data));
		    		}
			    }

		    }else {

		    	if($type == 'sendmsg'){
			    	$array = Cache::get('user_info-'.$room_id);
			    	//发送数据
			    	$sendData = array(
			        	'content' => $user_name.':'.$dataRes['content'].'--'.$room_id.'--'.$array_key,
			        	'user_name' => $user_name,
			        	'count' => count($array),//在线人数
		        	);
		        	// dump($sendData);
			    	//获取房间所有用户fd
			        foreach ($array as $k=> $v) {
				    	// dump($v);
				    	// $reData = $frame->data;
						if($server->exist($v)){
			    			$server->push($v,json_encode($sendData));
			    		}
				    	
				    }
		    	}

		    }
		});

		$server->on('close', function ($ser, $fd) {
		    echo "{$fd} closed\n";
		    //将用户从缓存中清除
		    $this->rmCache($fd);
		});
		$server->start();
    }

    //删除缓存
    public function rmCache($fd)
    {	
    	$user_info = Cache::get($fd);
        if(!empty($user_info)){            
            $userInfo = $user_info[0];
            // dump($userInfo);
            // //找到相对应的用户,删除
            $user_array = cache::get($userInfo);

            dump($user_array);
            foreach($user_array as  $k => $v) {
                if($fd == $v){ 
                    unset($user_array[$k]);
                } 
            }
            // print_r($user_array);
            Cache::rm($userInfo); 
            // Cache($user_info,null);
            Cache::set($userInfo,$user_array);
            
            dump(Cache::get($userInfo));
        }
    }

    public function clear()
    {
    	Cache::set('danma', NULL);
		Cache::clear('danma');
		dump(Cache::get('danma'));
    }

    public function get()
    {
    	echo "获取数据";
 		 // //   	Cache::set('danma', NULL);
		// // Cache::clear('danma');
		// dump(Cache::get('danma'));
		$room_id = input('room_id');
		$array = Cache::get('danma'.$room_id);
		dump($array);
    }

}

 

你可能感兴趣的:(swoole,php)