详解Laravel中间件如何统计用户在线时长

广告:宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取~~~

详解Laravel中间件如何统计用户在线时长

本篇文章给大家带来了关于Laravel的相关知识,其中主要介绍了Laravel中间件怎么实现统计用户在线时长 ,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。

Laravel — 了解用户上次在线的时间以及总计在线时长

此处以统计后台用户(admin_users)的在线时长为例;前台用户的话,只是对应的表不一样(对应users)。

准备数据库

此处需要添加两个字段,分别是 上次在线时间 和 总计在线时长(秒为单位):

<?phpuse Illuminate\Database\Migrations\Migration;use Illuminate\Database\Schema\Blueprint;use Illuminate\Support\Facades\Schema;class AddSpentToAdminUsersTable extends Migration{    /**     * Run the migrations.     *     * @return void     */    public function up()    {        Schema::table('admin_users', function (Blueprint $table) {            $table->unsignedInteger('spent')->default('0')->comment('使用时长')->after('id');            $table->timestamp('onlined_at')->nullable()->comment('最后访问时间')->after('updated_at');        });    }    /**     * Reverse the migrations.     *     * @return void     */    public function down()    {        Schema::table('admin_users', function (Blueprint $table) {            //            $table->dropColumn(['spent', 'onlined_at']);        });    }}
登录后复制

创建中间件

<?phpnamespace App\Http\Middleware;use Carbon\Carbon;use Closure;use Dcat\Admin\Admin;use Illuminate\Support\Facades\Cache;class CountAdminUserOnlineTime{    public function handle($request, Closure $next)    {        $user = Admin::user(); // 获取当前认证用户        //dd($user);        if ($user) {            $seenKey = 'auser-last-seen-'; //缓存标识            $lastSeenAt = Cache::get($seenKey . $user->id); // 获取上次访问时间戳            $now = Carbon::now();            if ($lastSeenAt != null) {                $duration = $now->diffInSeconds($lastSeenAt); // 计算在线时长(秒数)                $user->increment('spent', $duration, ['updated_at' => $user->updated_at, 'onlined_at' => $now]); //updated_at 维持原值            }            Cache::put($seenKey . $user->id, $now, Carbon::now()->addMinutes(1)); // 保存当前访问时间戳(并设置缓存过期时间为一分钟)        }        return $next($request);    }}
登录后复制

此处没有用使用 DB facade 来避免更新用户表的{更新时间}字段,而用 increment 函数的第二个参数来维持 updated_at 值不变。

应用中间件

在 \app\Http\Kernel.php 中添加一个 $routeMiddleware

protected $routeMiddleware = [        //其它        'admin.spent' => \App\Http\Middleware\CountAdminUserOnlineTime::class,        //其它    ];
登录后复制

如果你用的是 dcat-admin 后台框架,可以在 config/admin.php 的 route 配置里直接附加 middleware:

'middleware' => ['web', 'admin'], // 默认值:'middleware' => ['web', 'admin', 'admin.spent'], //添加在线时长中间件
登录后复制

其它情况: 在路由定义里添加:

Route::middleware([/* 其它中间件*/ , 'admin.spent'])->group(function () {    //... 需要统计的路由});
登录后复制

dcat-admin 在概览页面展示用户时长:

//新建一个 AdminUser 模型继承默认的 Administrator<?phpnamespace App\Models;use Dcat\Admin\Models\Administrator;class AdminUser extends Administrator{}//在线时间表格use Carbon\Carbon;use Dcat\Admin\Widgets\Callout;use Dcat\Admin\Widgets\Tab;use Dcat\Admin\Widgets\Table;...public static function tab()    {        $data = AdminUser::query()            ->orderBy('onlined_at', 'DESC')            ->get(['name', 'onlined_at', 'spent'])            ->toArray();        foreach ($data as &$d) {            if (!$d['spent']) {                $d['spent'] = '-';            } else {                $d['spent'] = formatTime($d['spent']);            }            if (Carbon::parse($d['onlined_at'])->diffInMinutes() <= 5) {                $d['name'] = '<i class="fa fa-circle" style="font-size: 13px;color: #4e9876"></i>&ensp;' . $d['name'];            } else {                $d['name'] = '<i class="fa fa-circle" style="font-size: 13px;color: #7c858e"></i>&ensp;' . $d['name'];            }        }        $titles = ['管理员', '最后在线', '总在线时长'];        return Tab::make()            ->padding(0)            ->add('业务信息',                Callout::make('后台用户(最近登录)')->success() . Table::make($titles, $data)            );    }//公共函数库增加 formatTime/** * 将给定秒数转换为以“x天x时x分钟”形式 * e.g. 123456 => 1天10时17分钟 */function  formatTime($seconds){ $days  =  floor($seconds  /  86400); $hours  =  floor(($seconds  %  86400)  /  3600); $minutes  =  floor(($seconds  %  3600)  /  60); $result  =  ""; if  ($days  >  0)  { $result  .=  "{$days}天"; } if  ($hours  >  0)  { $result  .=  "{$hours}时"; } if  ($minutes  >  0)  { $result  .=  "{$minutes}分钟"; } return  $result;}
登录后复制

统计结果示例

推荐学习:《laravel视频教程》

以上就是详解Laravel中间件如何统计用户在线时长的详细内容,更多请关注9543建站博客其它相关文章!

9543建站博客
一个专注于网站开发、微信开发的技术类纯净博客。
作者头像
admin创始人

肥猫,知名SEO博客站长,14年SEO经验。

上一篇:关于 PHP 7.2 abstract function override 的使用
下一篇:如何用PHP正则表达式验证银行卡格式

发表评论

关闭广告
关闭广告