设置用户';s last_visit


proper way to set user's last_visit

在数据库中更新用户上次访问的正确方法是什么?

我在users表中有last_visit列,并将此代码添加到bootstrap.php文件中

protected function _initUser() {
        $this->bootstrap(array('db'));
        $auth = Zend_Auth::getInstance();
        $identity = $auth->getIdentity();
        if($identity) {
            $userModel = new Model_User();
            $user_id = $identity->id;
            $userModel->updateLastVisit($user_id, date("Y-m-d H:i:s"));
        }
    }

这样好吗?还是我应该用这种不同的方式?

编辑

我最终这样做了,所以数据库每5分钟只查询一次。我可以让它保持原样吗?或者是否需要进行更多的更改以使其更好地工作(从性能角度来看)

protected function _initUser() {
    $auth = Zend_Auth::getInstance();
    if($auth->hasIdentity()) {
        $currentUser = $auth->getIdentity();
        if((time() - strtotime($currentUser->last_visit)) > 60*5) {
            $last_visit = date("Y-m-d H:i:s");
            $currentUser->last_visit = $last_visit;
            $this->bootstrap(array('db'));
            $user = new Model_User();
            $user->updateLastVisit($currentUser->id, $last_visit);
        }
    }
}

如果速度没有问题,那没关系。现在,每个请求都有一组操作(即使看起来很简单,Zend也会在这两行后面做很多工作)。如果你战斗了几十毫秒,这些线条是第一批需要改进的线条之一。我认为你不需要有最新的可能价值。因此,在登录后或用户由于启用了"记住我"而自动登录时更新last_visit就足够了。

在调度请求时,您应该使用插件挂钩执行这种操作,就像检查用户是否登录时一样。虽然它通过引导类工作,但从架构的角度来看,这与应用程序的交叉关注点有关(请参阅面向方面的编程)。

您甚至可以在访问检查插件中执行此操作,类似于@FAngel提出的建议:在登录后或获取cookie后存储新日期,避免每次用户重新加载页面时请求数据库

上次登录:更新登录控制器中的日期时间。示例:https://gist.github.com/2842698(第100行),或者正如Keyne已经说过的,把它放在一个特殊的插件中。

上次访问:我们将此数据临时放在键值存储(memached)中,并每5分钟用cronjob保存一次数据。因此,您的数据库不会出现任何性能问题。