轻松学会Workerman实战

聊天室的房间

此课程是收费课程,请先购买或加入会员后再访问。

我这里设置了两个房间,分别叫做 吃货人生技术探讨。这个也是为了模拟真实的情况,用户可以进入不同的聊天室来发表信息。点击后,看到网址上,出现了room_id这个参数,它的作用就是为了区分不同的房间了。

room_id

public function index(Request $request)
{
    $room_id = $request->room_id ? $request->room_id : '1';
    session()->put('room_id', $room_id);

    //..
}

我们将点击链接后,得到room_id取得后,存入session,这样方便下面的代码好使用。

Tips:
注意下,laravel中的session,不是原生php的session,所以你不能用$_SESSION。得用laravel提供的方法来存取。https://laravel.com/docs/5.5/session
除了put外,这种写法也是可以的session(['room_id' => $room_id])

进入房间

用户进入某一个房间后,就需要调用joinGroup来把当前用户,加入到一个中。这里Group的意思,你可以直接理解成一个房间就好了。

private function bind($request)
{
    Gateway::joinGroup($client_id, session('room_id'));
}

聊天历史记录

存数据库的时候,加上当前房间的room_id

public function say(Request $request)
{
    //...

    Message::create([
        'room_id' => session('room_id'),
        //...
    ]);
}

查询的时候,只查询对应房间的历史聊天记录

private function history()
{
    //...
    $messages = Message::with('user')->where('room_id', session('room_id'))->orderBy('id', 'desc')->limit(5)->get();

    //...
}

只发送给当前房间的用户

然后找到所有的Gateway::sendToAll(json_encode($data));,修改为

Gateway::sendToGroup(session('room_id'), json_encode($data));

这样就可以实现进入聊天室的不同房间了。

注意

视频中,有个地方修改掉了,请大家自行修改一下

private function users()
{
    $data = [
       //...

       //只查询当前组的用户
        'data' => Gateway::getClientSessionsByGroup(session('room_id')),
    ];

    //...
}