在Laravel中使用一个简单的方法来跟踪用户是否在线在程序用户个人资料页面的用户名旁边添加一个绿点来指示他们是否在线。我的第一个想法是我们需要启动一个node.js服务器并跟踪每个用户的活动套接字连接。然后通过当前登录的用户socket,我们可以实时更新在线状态!唯一的问题是,这对于我们当前的要求来说有点过头了,而且在我们拥有需要第二级准确性的功能(如实时聊天)之前,这并不是完全必要的。一位同事指出,MySpace处理“在线”功能的方式可能足以满足当前的需求。据我们所知,MySpace用来显示用户是否在线的方式是基于他们在网站上的最后一次活动。如果他们的最后一次活动是在X分钟内,我们会显示“在线”徽章,否则我们不会显示。简单的!让我们为用户的上次活动向用户表添加一个字段,并在每次页面请求时更新它。然后当我们需要检查用户是否在线时,我们可以将该时间戳与当前时间戳进行比较,如果在X分钟内,则他们在线!虽然这可以很好地工作,但根据您正在构建的应用程序,它会向数据库添加不必要的写入,这可能会降低您的应用程序的速度。一个好的折衷方案是将此信息存储在应用程序缓存中。缓存的好处在于它简化了这种方法,因为您可以将缓存设置为过期。既然我们已经决定使用缓存来实现这个特性,下一个问题是这段代码应该在哪里运行,以便它在每个请求上运行?我有两个想法让它工作:创建一个BaseController并让所有控制器继承它在中间件中。我们有一个计划,让我们进入代码!首先,我们需要创建一个中间件。在终端中输入以下命令:phpartisanmake:middlewareLogLastUserActivity接下来,我们打开以下php文件app/Http/Middleware/LogLastUserActivity.php。将以下代码添加到handle方法中:if(Auth::check()){$expiresAt=Carbon::now()->addMinutes(5);Cache::put('user-is-online-'.Auth::user()->id,true,$expiresAt);}接下来,我们打开app/Http/Kernel.php文件。如果你使用的是Laravel5.1或更早版本,你应该将代码直接放在$middleware数组中。如果您的版本是5.2.*,您应该将代码放在web中的$middlewareGroups中。注意代码必须放在StartSession中间件下面,否则Authfacade将无法正确登录用户。我的更新配置设置如下:protected$middlewareGroups=['web'=>[\App\Http\Middleware\EncryptCookies::class,\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,\Illuminate\Session\Middleware\StartSession::class,\Illuminate\View\Middleware\ShareErrorsFromSession::class\App\Http\Middleware\VerifyCsrfToken::class,\App\Http\Middleware\LogLastUserActivity::class,],'api'=>['油门:60,1',],];最后一步是向我们的用户对象添加一个方法来检查这个值。在app/User.php中,我们添加以下方法:publicfunctionisOnline(){returnCache::has('user-is-online-'.$this->id);}现在在任何页面中,您都可以添加以下内容方法:@if($user->isOnline())用户在线!!@endif重要说明——确保在文件顶部包含所有use外观!以上希望对你有所帮助!
