从Laravel框架创建在线用户(问题)

时间:2019-02-28 05:41:01

标签: php mysql laravel frameworks

我不确定我是否已经完成想法,我想使用Laravel Framework在线创建用户页面,我想知道我用来将用户引入数据库的方法是否正确,如果时间超过了限制。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;

class Automatism {

    public function handle($request, Closure $next) {
        DB::table('users_online')->updateOrInsert(
          ['user-ip' => \Request::getClientIp(true)],
          [
            'user-viewing-url' => Route::getFacadeRoot()->current()->uri(),
            'user-ip' => \Request::getClientIp(true),
            'timestamps' => now()
          ]
        );

        DB::table('users_online')->where('timestamps', '<', 'now() - INTERVAL 5 MINUTE')->delete();
        return $next($request);
    }
}

然后在此代码旁边,我想对24小时之内访问过该网站的用户执行相同的操作。

1 个答案:

答案 0 :(得分:0)

我制作了一个中间件来跟踪用户活动一次,这也许可以为您提供想法:

public function handle($request, Closure $next)
    {
        $this->request = $request;
        if(Auth::check()) {
            Cache::put('user-is-online-' . Auth::user()->id, true, Carbon::now()->addMinutes(5));
            $this->storeDailyUserActivity();
        }

        return $next($request);
    }

    public function storeDailyUserActivity(){
        $daily_active_user = [];
        if(Cache::has('daily_active_user')){
            $daily_active_user = Cache::get('daily_active_user');
            if(!is_array($daily_active_user)){
                Cache::forget('daily_active_user');
                $this->storeDailyUserActivity();
                return;
            }
            $daily_active_user['cache_old_date'] = $daily_active_user['cache_date'] ?? 'err_no_cache_date'; //debug only
        }
        $daily_active_user[Auth::user()->id] = Carbon::now();
        $daily_active_user['cache_date'] = Carbon::now()->toTimeString() . ' - ' . $this->request->url(); //debug only
        Cache::forever('daily_active_user', $daily_active_user);
    }
  • 它使用缓存来防止对每个请求执行数据库查询(如果您确实需要将其保存到数据库中,则需要进行调整)。注意:您将需要一个支持缓存键的缓存驱动程序(请参阅Laravel doc)。
  • 它为每个用户存储一个唯一的缓存密钥,因此在您的代码后面,您可以为特定用户检查该密钥(例如:如果该用户在最近5分钟内处于活动状态)
  • 它还将所有用户的上次活动日期存储在一个数组中。因此,您可以循环浏览,查找用户以及上次活动的时间(例如:显示最近2小时内所有活动的用户)。
  • 有点旧,可以改进。然后可以轻松地创建帮助程序来检查那些缓存值(例如:isUserActiveInLastMinutes($minutes = 5))。

在您确实需要将其保存到数据库的情况下,我会这样做:

  • 在用户上添加last_activity时间戳列(或在用户表和user_activity表之间建立oneToOne关系)
  • 针对每个用户请求更新此last_activity(我建议至少使用5分钟的缓存以防止在每个用户请求上添加数据库查询)
  • 然后您可以雄辩地查询“所有具有last_activity> Carbon :: now()-> subMinutes(5)的用户”