Detailed explanation of how Laravel middleware counts user online time
This article brings you relevant knowledge about Laravel, which mainly introduces how the Laravel middleware implements statistics of user online time. Friends who are interested can take a look below. I hope it will be helpful to everyone.
Laravel — To understand the last time the user was online and the total online time
Here to count the online status of background users (admin_users) Take duration as an example; for front-end users, only the corresponding tables are different (corresponding to users).
Prepare the database
You need to add two fields here, namely the last online time and the total online time (in seconds):
<?php use 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']); }); } }
Create middleware
<?php namespace 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); } }
There is no need to use the DB facade to avoid updating the {update time} field of the user table, but use the second parameter of the increment function to maintain the updated_at value. Change.
Application Middleware
Add a $routeMiddleware in \app\Http\Kernel.php
protected $routeMiddleware = [ //其它 'admin.spent' => \App\Http\Middleware\CountAdminUserOnlineTime::class, //其它 ];
If you are using dcat-admin For the background framework, you can add middleware directly to the route configuration of config/admin.php:
'middleware' => ['web', 'admin'], // 默认值: 'middleware' => ['web', 'admin', 'admin.spent'], //添加在线时长中间件
Other situations: Add:
Route::middleware([/* 其它中间件*/ , 'admin.spent'])->group( function () { //... 需要统计的路由 });
dcat-admin to the route definition and display the user duration on the overview page :
//新建一个 AdminUser 模型继承默认的 Administrator <?php namespace 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> ' . $d['name']; } else { $d['name'] = '<i class="fa fa-circle" style="font-size: 13px;color: #7c858e "></i> ' . $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; }
Example of statistical results
Recommended study: "laravel video tutorial" ##
The above is the detailed content of Detailed explanation of how Laravel middleware counts user online time. For more information, please follow other related articles on the PHP Chinese website!

What new features and best practices does Laravel's migration system offer in the latest version? 1. Added nullableMorphs() for polymorphic relationships. 2. The after() method is introduced to specify the column order. 3. Emphasize handling of foreign key constraints to avoid orphaned records. 4. It is recommended to optimize performance, such as adding indexes appropriately. 5. Advocate the idempotence of migration and the use of descriptive names.

Laravel10,releasedinFebruary2023,isthelatestLTSversion,supportedforthreeyears.ItrequiresPHP8.1 ,enhancesLaravelPennantforfeatureflags,improveserrorhandling,refinesdocumentation,andoptimizesperformance,particularlyinEloquentORM.

Laravel's latest version introduces multiple new features: 1. LaravelPennant is used to manage function flags, allowing new features to be released in stages; 2. LaravelReverb simplifies the implementation of real-time functions, such as real-time comments; 3. LaravelVite accelerates the front-end construction process; 4. The new model factory system enhances the creation of test data; 5. Improves the error handling mechanism and provides more flexible error page customization options.

Softleteinelelavelisling -Memptry-braceChortsDevetus -TeedeecetovedinglyDeveledTeecetteecedelave

Laravel10.xisthecurrentversion,offeringnewfeatureslikeenumsupportinEloquentmodelsandimprovedroutemodelbindingwithenums.Theseupdatesenhancecodereadabilityandsecurity,butrequirecarefulplanningandincrementalimplementationforasuccessfulupgrade.

LaravelmigrationsstreamlinedatabasemanagementbyallowingschemachangestobedefinedinPHPcode,whichcanbeversion-controlledandshared.Here'showtousethem:1)Createmigrationclassestodefineoperationslikecreatingormodifyingtables.2)Usethe'phpartisanmigrate'comma

To find the latest version of Laravel, you can visit the official website laravel.com and click the "Docs" button in the upper right corner, or use the Composer command "composershowlaravel/framework|grepversions". Staying updated can help improve project security and performance, but the impact on existing projects needs to be considered.

YoushouldupdatetothelatestLaravelversionforperformanceimprovements,enhancedsecurity,newfeatures,bettercommunitysupport,andlong-termmaintenance.1)Performance:Laravel9'sEloquentORMoptimizationsenhanceapplicationspeed.2)Security:Laravel8introducedbetter


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

SublimeText3 Chinese version
Chinese version, very easy to use

WebStorm Mac version
Useful JavaScript development tools

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver Mac version
Visual web development tools
