如何监控用户离开网站的时间?(Laravel / PHP)



考虑以下示例:

用户单击一个按钮,该按钮发送某种请求返回开始一个任务,该任务在30分钟后完成。在前端,我们显示一个计时器,倒计时30分钟。

如果用户停留30分钟,则会发生其他事情。如果用户离开、注销或关闭浏览器,计时器应该仍在运行,但这次是在后端。

我知道在这种情况下,我会使用Laravel的事件/通知系统来处理整个按钮被点击,让我们设置计时器并在完成时通知。但是我怎么监控当你离开的时候X发生了当你重新登录或者回来的时候(30分钟后)有一个通知

从本质上讲,你如何复制那些带有计时器的"游戏",允许你离开并返回,而计时器(在现实世界的时间)已经下降?

我会考虑将Middleware与数据库结合使用。

创建Middleware用于跟踪用户的活动,并将其应用于要跟踪用户的路由:

class TouchOnline
{
    /**
     * The user
     *
     * @var $user
     */
    protected $user;
    /**
     * Create a new session middleware
     *
     * @return void
     */
    public function __construct()
    {
        $this->user = Auth::user();
    }
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // Update their timestamp
        if (count($this->user)) $this->user->touchOnline();
        // Continue with request
        return $next($request);
    }
}

在您的User模型中,您将需要:

  • 更新last_active属性的方法
  • 设置time_limit属性的方法比较两者的方法

可能看起来像:

class User extends Authenticatable
{
    /**
     * Update a user's last_active time
     * 
     * @return void
     */
    public function touchOnline()
    {
        $this->last_active = $this->freshTimestamp();
        $this->save();
    }
    /**
     * Set a user's time_limit
     *
     * @return integer
     */
    public function setTimeLimit()
    {
        $this->time_limit = Carbon::now()->addMinutes(30);
        $this->save();
    }
    /**
     * Sort if user has lapsed over time_limit
     *
     * @return bool
     */
    public function isUserOverTimeLimit()
    {
        $last_active = $this->last_active;
        $time_limit = $this->time_limit;
        if ($last_active > $time_limit) return true;
        return false;
    }
}

做得很粗略,但应该给你指明正确的方向。希望能有所帮助!

最新更新