0

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

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

3 回答 3

0

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

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

于 2012-09-01T02:54:47.710 回答
0

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

上次访问:我们将这些数据临时存储在 key-value storage(memached) 中,每 5 分钟使用一次 cronjob 保存数据。所以你的数据库没有任何性能问题。

于 2012-09-05T15:19:23.153 回答
0

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

于 2012-09-01T01:53:53.523 回答