视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Laravel实现跟踪用户是否在线功能
2020-11-03 18:19:06 责编:小采
文档


Laravel 中使用简单的方法跟踪用户是否在线

今天,我的任务是,在 Laravel 应用程序用户个人资料页面上,用户名旁边添加一个绿点,表示他们是否在线。

我首先想到的是,我们将需要启动一个 node.js 服务器并跟踪每个用户的活动套接字连接。然后用当前登录的用户套接字,我们可以实时更新在线状态!

唯一的问题是,这是我们目前的要求,有点超过顶部,并没有完全必要的,直到我们的功能,需要达到第二个准确性,如实时聊天。

一位同事指出,对于目前的需求,MySpace 用来处理 “在线” 功能的方式可能就足够了。就我们所知,MySpace 用来显示用户是否在线的方式是基于他们在网站上的最后一项活动。

如果他们的最后一次活动在 X 分钟内,我们会显示 “在线” 徽章,如果没有,我们不会。简单!

让我们为用户的上次活动在用户表中添加一个字段,并且在请求每个页面时更新它。然后当我们需要检查用户是否在线,我们可以将该时间戳与当前时间戳进行比较,如果在 X 分钟内,则他们在线!

虽然这可以工作得很好,这取决于你正在构建的应用程序,它会向数据库添加不必要的 写入,这会在某种程度上降低你应用程序的速度。

一个好的折衷办法是将这些信息存储在应用程序缓存中。 缓存的好处是可以简化这种方法,因为可以设置缓存为过期。

现在我们决定使用缓存实现这个特性,下一个问题是这个代码应该在哪里运行,以便它在每个请求上运行?我有两个想法可以实现:

创建一个 BaseController,让你所有的 Controller 都继承它

创建一个中间件

经过一些思考,并意识到我需要在所有已经编写的构造函数中添加对父构造函数的调用,我选择在中间件中实现。

我们有个计划,让我们进入代码!

首先,我们需要创建一个中间件。在终端中输入以下命令:

php artisan make:middleware LogLastUserActivity

接下来我们打开以下 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 文件。如果您使用的是 Laravel 5.1 或 更早的版本, 您应该把代码直接放置到 $middleware 数组中。 如果您的版本是 5.2.* , 您应该把代码放置到 $middlewareGroups 的 web 中 。

注意,一定要把代码放到 StartSession 中间件的下方,否则 Auth 门面将不会正确在 user 中记录 log。我的更新配置设置如下:

protected $middlewareGroups = [
 'web' => [
 AppHttpMiddlewareEncryptCookies::class,
 IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
 IlluminateSessionMiddlewareStartSession::class,
 IlluminateViewMiddlewareShareErrorsFromSession::class
 AppHttpMiddlewareVerifyCsrfToken::class,
 AppHttpMiddlewareLogLastUserActivity::class,
 ],
 'api' => [
 'throttle:60,1',
 ],
 ];

最后一步是添加一个方法到我们的 user 对象中去检测这个值。

在 app/User.php 我们添加下面的方法:

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

现在在任何页面中你就能添加下面的方法:

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

重要提示 -- 确保在你的文件顶部使用 use 引入所有的 facades!

我希望上面这些能帮助到你们解决这个问题!

更多laravel框架相关技术文章,请访问laravel教程栏目!

下载本文
显示全文
专题