在数据库中更新用户上次访问的正确方法是什么?
我在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保存一次数据。因此,您的数据库不会出现任何性能问题。