实现更新用户上次访问数据库的正确方法是什么?
我在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);
}
}
}
答案 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分钟保存一次数据。因此,您的数据库没有任何性能问题。