【发布时间】:2011-11-24 09:34:42
【问题描述】:
我有一个 Web 应用程序,其中复杂的权限决定了用户是否可以访问数千个不同文件中的每一个。用户可以查看所有文件,但有一个指示器可以打开他们有权访问的文件。如果组织中的其他人有权访问该文件,或者与他们合作的某个人具有对该文件的共享访问权限,则用户有权访问该文件。
现在,我有一个复杂的 PHP 函数,它通过构建用户在其组织或协作中可以访问的文件的数组并合并这些访问数组来生成一个大型 PHP 会话。当这些文件显示给用户时,PHP 会检查此数组以查看他们是否有权访问,如果有,则添加打开文件的按钮。我这样做是因为在显示长文件列表时运行查询来检查每个文件的访问权限最终会花费太长时间,而 PHP 的 in_array() 速度要快得多。
问题是……
php 会话变得如此之大,以至于它似乎正在减慢简单的网站功能,我需要想出一种新的方法来做到这一点。
我的问题是……
替换 PHP 会话以存储用户可以访问的数千个文件的文件权限和文件位置的最佳方法是什么,以便在显示文件列表时,PHP 可以快速检索此信息,而无需为每个单独的文件运行查询?
【问题讨论】:
-
你考虑过使用memcached来存储数组吗?另外,您是否确定了访问设置的哪一部分实际上导致了僵局?
-
有时显示的文件列表可能长达数百个。当显示这些文件时,对于每个文件,PHP 需要运行查询以查看他们是否有权访问它,他们的组织是否有权访问它,然后查询该用户的每个协作以查看他们是否有访问它。这对于许多单独的查询来说太远了,而且需要很长时间。拥有一大堆预先生成的访问权限要快得多。可能不是最好的方法,但它比为每个文件运行多个查询要快。
-
不可能将查询减少到更少(一个?)查询吗?另外,请注意您回复的评论我已删除(在您回复之前),但无论如何它都会有所帮助。此外,分页结果可能会有所帮助,或者将其卸载到另一个进程并在它准备好后加载响应(例如旅游网站,尽管这有点极端)。
-
Chuck 的方法似乎可以做到这一点......将会话存储在数据库中并查询用户在显示文件列表时可以访问的所有文章,然后检查每个文件是否在该结果数组中。这种方法听起来是不是最有效?
-
我想,在你做任何事情之前,首先要找出僵局发生在哪里(xdebug.org),然后从根本上解决问题。将当前基于会话的数组卸载到数据库字段中,至少从表面上看,在我看来并不是一种更有效的方法,但我也不确定。首先找出实际问题出在哪里。