我的网站对每个客户都有一个非常精细的权限系统,使其规模相当大。
为了限制数据库查询,我一直在用户会话开始时从 mysql 数据库加载位掩码,然后将其保存为会话数据,所以它看起来像这样。这使我可以为每个用户会话进行一次(尽管它是复杂的 JOIN 查询)查询,而无需创建巨大的会话文件。
"permissions" => array(
"type 1" => 'bitfield'
"type 2" => 'bitfield'
"type 3" => array(
entity id = 'bitfield'
entity id = 'bitfield')
"type 4" => array(
entity id = 'bitfield'
entity id = 'bitfield')
)
权限完全基于组,因此给定组中的每个人都会在他们的会话数据中复制此权限。
然而,位掩码开始使用起来很痛苦,我希望转向使用 acl。然而,我一开始没有使用 acl 的原因是为了尽量减少数据库的使用。
所以.. 现在我将拥有一个完全由数据库/缓存驱动的 acl,没有任何位掩码。然而,在用户会话数据中存储大量权限似乎并不理想。(你同意?)
我认为要走的路是使用平面文件缓存来存储组权限。最简单的方法是每组一个文件吗?当有 4,000 + 个组,每个组具有 4 种权限类型(2 种权限类型是全局的,具有 40 个左右的权限,2 种类型是本地权限,每个实体有 40 个左右的权限(每种类型可能有 3 或 4 个20 个权限!)。编辑:为清楚起见,这意味着每组 160 - 200 个权限条目
这似乎是一个相当大的缓存!每次页面加载时都使用大量数据库会更好吗?这种数据大小使位掩码变得容易得多,但它们只是不够灵活了。
由于文件由 2 个不同的服务器提供服务(会话粘着,因此将位域保存到会话数据不是问题),这使得这变得更加困难,因此任何缓存都必须在服务器之间同步。数据库位于通过专用网络连接的单独服务器上,据称是 1gig 连接。
可以提出任何解决方案吗?我认为具有这么多数据的快速访问缓存(例如 memcached)只会让我的内存使用量大增?我很想只使用大量的数据库查询,但我认为这可能会给数据库服务器带来太大的压力。
相当大的问题,我希望它清楚。如果有任何需要澄清,请告诉我。任何解决方案将不胜感激!
克里斯