PHP会话vs.数据库查找


PHP Session vs. DB Lookup

我读过关于这个话题的相互矛盾的信息,所以我希望根据我提出的方案,一个计划会比另一个更理想。

在我的例子中,有"用户"可以访问由"节"组成的"组"。根据用户的配置方式,每个部分可以具有不同的权限级别。所以我可能是一个部门的"管理员",而我的同事是"基本"。

登录后,用户将选择他们想要管理/查看的组。我最初的计划是查找用户/组/节/权限信息并存储在会话中的数组中,如…

$_SESSION[group_id][sectioin_id]['permission'] = 7; // 1+2+4 (R+W+X)

然后当他们进入一个页面时,我可以查看他们在哪个组,看到他们在哪个部分页面,并根据他们的权限显示适当的信息。

或者,我可以构建一个DB查找脚本来检查此信息,但它必须在多个连接表中查找并解析每个PAGE的结果。这对我来说似乎效率低下,但从我读到的关于如何为每个页面编写会话的信息来看,情况可能并非如此。

谢谢你的建议。

//----更多关于会话大小的信息

现在一个组最多有5个section,最多有3个数据。当前会话的最大大小类似于:

$_SESSION[1][1]['permission'] = 7;
$_SESSION[1][1]['type'] = 'paid';
$_SESSION[1][1]['expires'] = '2011-08-01';
$_SESSION[1][2]['permission'] = 7;
$_SESSION[1][2]['type'] = 'free';
$_SESSION[1][3]['permission'] = 7;
$_SESSION[1][3]['type'] = 'paid';
$_SESSION[1][3]['expires'] = '2011-08-01';
$_SESSION[1][4]['permission'] = 7;
$_SESSION[1][4]['type'] = 'paid';
$_SESSION[1][4]['expires'] = '2011-08-01';
$_SESSION[1][5]['permission'] = 7;
$_SESSION[1][5]['type'] = 'free';

在这种情况下,第1、3、4节属于付费版本,第2、5节属于免费版本。每次登录是否有太多的会话内容要跟踪?

我认为这是一个非常丑陋的hack。您要做的是构建一个大对象,并在php解释器的多次执行中保留它。将对象隐藏到会话数据中很聪明,但这是一种"错误"的方法。

请记住,对于每个新用户会话,您都在存储完整的权限表集,一遍又一遍地复制相同的数据。

在我看来,你应该在登录时进行昂贵的查找(可能没有其他繁重的工作要做),然后在他/她的会话中保留用户的权限掩码,如$_SESSION["permission"] = 7

如果你真的想在多个交互中保存权限提供程序,请查看对象序列化;你可以在不滥用$_SESSION的情况下在数据库中存储对象。

两种方法都可以。注意事项:

  • 对系统的访问有多敏感?如果你使用会话方法,用户被禁用或权限被删除,他们仍然可以访问,直到他们下次登录。
  • 会话数据的大小应该受到限制。如果你有一百万个组/段/权限,你的会话数据将非常大,处理速度很慢。