设置用户last_visit的正确方法

时间:2012-09-01 01:39:57

标签: php zend-framework

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

我在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);
        }
    }
}

3 个答案:

答案 0 :(得分:0)

如果您对速度没有任何问题,那就没问题。现在,每个请求都有一堆操作(即使看起来非常简单 - Zend会在这两行之后做很多工作)。如果你打了几十毫秒 - 这些线是第一个改进的候选者之一。我认为你不需要拥有最新的价值。因此,在登录后或由于启用“记住我”而自动登录用户时,更新last_visit就足够了。

答案 1 :(得分:0)

在调度请求时,您应该使用plug-in hooks执行此类操作,就像检查用户是否已登录时一样。当从架构的角度来看,它通过引导类工作时,这与您的应用的cross-cutting concerns相关(请参阅Aspect-oriented programming)。

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

答案 2 :(得分:0)

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

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