PHP Laravel 中使用简单的方法跟踪用户是否在线
今天,我的任务是,在 Laravel 应用程序用户个人资料页面上,用户名旁边添加一个绿点,表示他们是否在线。我首先想到的是,我们将需要启动一个 node.js 服务器并跟踪每个用户的活动套接字连接。然后用当前登录的用户套接字,我们可以实时更新在线状态!唯一的问题是,这是我们目前的要求,有点超过顶部,并没有完全必要的,直到我们的功能,需要达到第二个准确性,如实时聊天。 一位同事指出,对于目前的需求,MySpace 用来处理 “在线” 功能的方式可能就足够了。就我们所知,MySpace 用来显示用户是否在线的方式是基于他们在网站上的最后一项活动。如果他们的最后一次活动在 X 分钟内,我们会显示 “在线” 徽章,如果没有,我们不会。简单! 让我们为用户的上次活动在用户表中添加一个字段,并且在请求每个页面时更新它。然后当我们需要检查用户是否在线,我们可以将该时间戳与当前时间戳进行比较,如果在 X 分钟内,则他们在线!虽然这可以工作得很好,这取决于你正在构建的应用程序,它会向数据库添加不必要的?写入,这会在某种程度上降低你应用程序的速度。一个好的折衷办法是将这些信息存储在应用程序缓存中。 缓存的好处是可以简化这种方法,因为可以设置缓存为过期。 现在我们决定使用缓存实现这个特性,下一个问题是这个代码应该在哪里运行,以便它在每个请求上运行?我有两个想法可以实现: 创建一个 BaseController,让你所有的 Controller 都继承它 我们有个计划,让我们进入代码! 首先,我们需要创建一个中间件。在终端中输入以下命令: php artisan make:middleware LogLastUserActivity 接下来我们打开以下 php 文件 app/Http/Middleware/LogLastUserActivity.php. 在其中的 handle 方法中添加下面的代码: 1 if(Auth::check()) { 2 $expiresAt = Carbon::now()->addMinutes(5); 3 Cache::put('user-is-online-' . Auth::user()->id,true,$expiresAt); 4 } ? 接下来,我们打开 app/Http/Kernel.php 文件。如果您使用的是 Laravel 5.1 或 更早的版本, 您应该把代码直接放置到?$middleware?数组中。 如果您的版本是 5.2.*,您应该把代码放置到?$middlewareGroups?的 web 中 。注意,一定要把代码放到?StartSession?中间件的下方,否则 Auth 门面将不会正确在 user 中记录 log。我的更新配置设置如下: 1 protected $middlewareGroups = [ 2 'web' => [ 3 AppHttpMiddlewareEncryptCookies::class, 4 IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class, 5 IlluminateSessionMiddlewareStartSession::class, 6 IlluminateViewMiddlewareShareErrorsFromSession::class 7 AppHttpMiddlewareVerifyCsrfToken::class, 8 AppHttpMiddlewareLogLastUserActivity::class, 9 ],10 'api' => [ 11 'throttle:60,1',12 ],13 ]; ? 最后一步是添加一个方法到我们的 user 对象中去检测这个值。在 app/User.php 我们添加下面的方法: public function isOnline() { return Cache::has('user-is-online-' . $this->id); }
现在在任何页面中你就能添加下面的方法: 1 @if($user->isOnline()) 2 user is online!! 3 @endif ? 重要提示 -- 确保在你的文件顶部使用 use 引入所有的 facades! 我希望上面这些能帮助到你们解决这个问题! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 【数据分析】R语言实现常用的5种数据分析(主成分+因子+多维
- PAT 甲级 1086 Tree Traversals Again
- delphi – 如何在文字上使用TExtendedHelper?
- Lua与C/C++的交互4:往Lua中写入C/C++变量
- Delphi 通信报Asynchronous socket error 10053错误的一个解
- Delphi 数据类型列表
- VB6 通过winsock控件数组实现客户端和服务器多对一通信
- Symbian 环境搭建
- vb.net – 你可以使用.Contains(string)和Select Case语句吗
- 如何让Perl和Python打印正在执行的程序的每一行?