我有一个Web应用程序,其中复杂的权限决定用户是否可以访问数千个不同文件中的每一个。用户可以查看所有文件,但有一个指示器可以打开他们有权访问的文件。如果用户中的其他人可以访问该文件,或者他们与之合作的某人拥有该文件的共享访问权限,则该用户可以访问该文件。
现在,我有一个复杂的PHP函数,通过构建用户可以访问的文件数组(在组织或协作中)以及合并这些访问数组来生成大型PHP会话。当这些文件显示给用户时,PHP会检查此数组以查看它们是否具有访问权限,如果有,则会添加按钮以打开该文件。我这样做是因为在显示长文件列表时运行查询来检查每个文件的访问权限最终会占用太长时间,并且PHP的in_array()速度要快得多。
问题是......
php会话已经变得如此之大以至于它似乎正在减慢简单网站功能的速度,我需要考虑一种新方法来实现这一目标。
我的问题是......
替换PHP会话以存储用户有权访问的数千个文件的文件权限和文件位置的最佳方法是什么,以便在显示文件列表时,PHP可以快速检索此信息,而无需为每个单独的文件运行查询?
答案 0 :(得分:6)
嗯,在不知道问题的全部范围的情况下,我建议在您的数据库中添加Sessions
表,并添加FilePermissions
字段和UserId
字段。
此字段将存储权限结构的json表示形式。这只需要对数据库进行一次调用,并且在解析json数据服务器端时会进行大部分处理(根本不应该有很多开销)。
这是减少客户端会话信息大小的标准方法。一个好的经验法则是在Sessions
表中放置任何暴露应用程序逻辑的内容。
<强>更新强>
我只会在
这只有在没有复杂的权限结构时才会起作用(就像每个文件都有读写权限)。如果没有,我会说你很清楚。
答案 1 :(得分:0)
我不确定你能做多少。也许memcached
可以提供帮助,但我没有使用它(尽管,从我所听到的,这就是它的用途)。
你可以将数组保存在一个文件中,但据我所知,这正是会话的作用。
您还可以尝试使用shared memory在脚本启动之间将用户数据保留在内存中。
您真的需要在一个阵列中拥有整个用户权限列表吗?也就是说,您是否总是向用户显示数千个文件?如果是这样,为什么?是否可以使用AJAX重新设计系统来懒惰地只获取一部分文件?
更新:另一个想法。
您还可以为每个文件预先计算用户的权限,并将其存储在数据库中。表可以称为FilesPermittedPerUser
,并且具有两列主键userID / fileID
。这将创建一个首先按userID
排序,然后按fileID
排序的索引。双列密钥也会强制条目的唯一性。
由于它会被用户编入索引,因此您只需ORDER BY userID
和LIMIT 10, 10
即可仅列出文件10-20。通过AJAX获取列表中的部分内容意味着您永远不会导致脚本当前导致的可怕内存负载。
只需要更新文件的权限(例如,创建文件,删除文件,更改组权限,更改用户的组成员身份,更改文件的组成员身份......)将不得不更新表。我怀疑这不应该太难。只需确保在事务中执行缓存更新,以保持操作原子性。
您可能还想在文件夹中组织文件系统。向用户扔掉大量文件并且必须始终维护它们是没有意义的。尝试在Explorer / Finder / Nautilus上抛出10.000个文件,看看打开该文件夹时会发生什么。什么都不好,他们可以保持记忆 - 而PHP则不然。
最终的想法(尽管你可能不必走这些极端):在非PHP的东西中重写文件系统API,并且可以保留权限数据。仅使用PHP将请求转发到运行在其他服务器上的自定义服务器。