PHP 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' => [
\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' => [
'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!
我希望上面这些能帮助到你们解决这个问题!
PHP Laravel 中使用简单的方法跟踪用户是否在线的更多相关文章
- 使用Opencv中matchTemplate模板匹配方法跟踪移动目标
模板匹配是一种在图像中定位目标的方法,通过把输入图像在实际图像上逐像素点滑动,计算特征相似性,以此来判断当前滑块图像所在位置是目标图像的概率. 在Opencv中,模板匹配定义了6种相似性对比方式: C ...
- Hangfire在ASP.NET CORE中的简单实现方法
hangfire是执行后台任务的利器,具体请看官网介绍:https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNe ...
- 网上很多laravel中cookie的使用方法。
https://blog.csdn.net/chen529834149/article/details/75244718 概述 Cookie的添加其实很简单,直接使用Cookie::make(),在使 ...
- laravel中的plicy授权方法:
1.用命令新建policy: php artisan make:policy PostPolicy 2.在app/Policies/PostPolicy.php中添加处理文件的权限的方法: //修改: ...
- laravel中resource资源路由方法
新增的 resource 方法将遵从 RESTful 架构为用户资源生成路由.该方法接收两个参数,第一个参数为资源名称,第二个参数为控制器名称. Route::resource('users', 'U ...
- vue中超简单的方法实现点击一个按钮出现弹框,点击弹框外关闭弹框
效果图展示: View层 <template> <div> <div class="mask" v-if="showModal" ...
- Laravel中不可逆的加密方法
1 //对 A 密码使用Bcrypt 加密 2 $password = Hash::make('secret'); 3 4 //你也可直接使用 bcrypt 的 function 5 $passwor ...
- Laravel 中使用 JWT 认证的 Restful API
Laravel 中使用 JWT 认证的 Restful API 5天前/ 678 / 3 / 更新于 3天前 在此文章中,我们将学习如何使用 JWT 身份验证在 Laravel 中构建 r ...
- laravel中如何执行请求
laravel中如何执行request请求?本篇文章给大家介绍关于laravel中执行请求的方法,需要的朋友可以参考一下,希望对你有所帮助. 我们先来看一下request是什么? 客户端(例如Web浏 ...
随机推荐
- string字符串转数组
/** * THis_is_a_cat * This Is A Cat * * Cat A Is This * @author Administrator * */ public class Test ...
- Python3字符串常见方法
目录 字符串的进阶使用 格式化输出字符串 当然除了上述方法外,还可以你使用format方法 format方法第二种用法: Python字符串与二进制的转换 字母大写 计字符a出现的次数 输出50个字符 ...
- 2019年高级Java程序员面试题汇总
目录 JDK Dubbo Zookeeper Strut2 Spring系列 Redis系列 Mysql系列 Java多线程 消息中间件 线程池 事物 JVM 设计模式 其他 程序设计 基础知识 编程 ...
- 使用Prometheus监控SpringBoot应用
通过之前的文章我们使用Prometheus监控了应用服务器node_exporter,数据库mysqld_exporter,今天我们来监控一下你的应用.(本文以SpringBoot 2.1.9.REL ...
- linux-scp命令及如何设置免密登录
部署测试环境时经常在两台服务器间copy文件,那么如何设置免密登录? 场景:源服务器A(如172) -> 目标服务器B(如71) 实现将服务器A的文件copy到服务器B 实现方式有两种: 在源 ...
- git clone下代码window与unix换行问题
项目中避免不了会写一些shell脚本,使用ln软连接到一个目录.当git clone到windows中,ln连接显示无比怪异(如../xx),打开.sh文件后(仅仅是打开了),git status会看 ...
- Rancher与ARM深化战略合作,“软硬结合”加速边缘计算时代
时至今日,许多企业已将边缘计算列为战略目标,对于部分企业而言,边缘计算则已成为它们势在必行的部分.而随着对应用软件和硬件能力的需求不断增长,容器和Kubernetes已发展为边缘计算领域备受瞩目的一项 ...
- 如果有人问你 MySql 怎么存取 Emoji,把这篇文章扔给他
01.前言 Emoji 在我们生活中真的是越来越常见了,几乎每次发消息的时候不带个 Emoji,总觉得少了点什么,似乎干巴巴的文字已经无法承载我们丰富的感情了.对于我们开发者来说,如何将 Emoji ...
- ES6基本语法入门
一.用let代替var声明变量 ES5中,我们可以在代码中任意位置声明变量,甚至可以重写已经声明的变量,ES6引入了一个let关键字,它是新的var. let language = 'javascri ...
- Linux下部署Jenkins
前提:已部署好JAVA 1.下载Jenkins库并添加到yum库: wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redha ...