0

在 PHP 中使用会话处理用户身份验证时,我看到成功登录后访问用户属性的两个主要选项:

  1. 将用户的主要属性加载到会话超全局中
  2. 仅将用户的 UID(用户名或 id # 等)加载到会话中,例如$_SESSION['username'],然后在页面加载时获取用户的主要属性并将它们存储在用户对象中

方法一

  • 通过会话超全局更容易访问范围

方法二

  • 当用户的数据被修改时,您不必担心更新会话变量,因为您在每个页面上获取它

我的问题

  • 我是否忽略了其他选择?
  • 通常“完成”的方式是什么?
  • 性能呢?在哪种情况下哪种方法会更快?

笔记

  • 当我说用户的“主要”属性时,我指的是那些将在许多页面上使用的属性,例如用户名、访问级别、电子邮件地址等。显然你不会加载太多的数据。

  • 我指的是数据库存储的会话,而不是基于文件的会话。

4

3 回答 3

1

这取决于项目,如果用户的某些信息最容易访问,则进入会话。我会这样做:

class User{
   private $userName;
   //ohter attrs
   //getters and setters    
}

function login(){
    $user = new User();
    //populate attrs 
    $_Session["user"] = $user
 }

不要将大批量数据放入会话中,将其留在数据库中,也不要放入 UID,放入一些User类对象。

于 2012-09-30T19:45:22.273 回答
1

通常,只存储 UID 或任何其他唯一标识符(例如用户名),因为所有其他数据都可以动态更改。但是,这取决于数据和项目本身。如果经常使用这些数据并且您真的关心更新它们,那么除了 UID 之外,加载例如访问级别、用户名和电子邮件可能会非常高效!另一方面,仅存储 UID 效率低下,因为您必须请求每个页面上的所有数据,但这是一种更安全的方法。无论如何,如果您需要在大多数页面上加载更多用户数据,这种方法会更好,因为无论如何您都必须请求数据。然而,为了提高例如数据库请求的效率,您可以使用数据库缓存。如果这样做,两种方式的效率可能几乎相等。简而言之,

另请注意,如果您存储 UID 以外的用户数据,您还需要保存会话 ID,因为用户可以打开多个会话,并且您需要确保他在更改用户数据时更改了同一个会话!

于 2012-09-30T19:48:29.430 回答
1

如果您关心性能,那么您可能需要考虑实现一个缓存层(例如 memcache)并将您提取的用户数据存储在缓存中。我通常这样做的方式是只使用 memcached 作为会话处理程序而不是数据库。

于 2012-09-30T19:48:37.230 回答