将所有用户变量加载到会话中或仅加载用户的UID?

时间:2012-09-30 19:39:03

标签: php session authentication session-variables

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

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

    • 通过会话超全局
    • 可以更轻松地访问范围

    方法2

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

    我的问题

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

    备注

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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