Skip to content

需求

系统的用户列表中添加一个绿点,表示他们是否在线。

方案

启动一个nodejs服务器追踪每个用户的socket连接,优点:准确,实时,缺点:麻烦

进一步方案

记录所有用户的上次的活动时间,只要超过一定当前时间,就判断为离线。

优点:实现简单,快速 缺点:可能需要为用户表添加字段,加重数据库负担

最终方案

我们不使用数据库,使用缓存。

为了保证在每个请求触发,需要创建一个middleware中间件 php artisan make:middleware LogLastUserActivity

内容如下:

php
// 判断是否是有效的登录用户
if(Auth::check()) {
    // 缓存只存储5分钟
    $expiresAt = Carbon::now()->addMinutes(5);
    Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt);
}

关于缓存

接下来,打开app/Http/Kernel.php,在protected $middlewareGroups的web中追加 \App\Http\Middleware\LogLastUserActivity::class,

最后,添加一个方法从缓存中读数据 在 app/User.php 我们添加下面的方法:

php
public function isOnline()
{
    return Cache::has('user-is-online-' . $this->id);
}

这样,在页面中调用方法

php
@if($user->isOnline())
    user is online!!
@endif