【问题标题】:Accessing Session variable and performance访问 Session 变量和性能
【发布时间】:2009-04-30 11:08:21
【问题描述】:

我有一个 Web 应用程序,我需要检查用户是否有足够的权限/角色/权限来访问该页面。我已经用USER_IDROLE_ID 在表中设置了用户权限。当用户登录到应用程序时,我将读取该用户的记录并构造一个字符串并分配给一个会话变量。当登录的用户访问每个页面时,我会从会话变量中读取值,然后解析字符串,然后检查该用户是否有足够的权限分配给它。

现在我担心在每次加载页面时访问会话变量是否会影响性能。有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: php performance session


    【解决方案1】:

    您应该会看到性能的净提升。

    加载会话需要一些资源,但这通常比从数据库中检索记录所需的资源少得多,这可能涉及创建连接、身份验证、解析查询、检索记录和发送它通过网络。与此相比,从硬盘中取出会话文件要快得多。

    听起来您确实在尝试过早地进行优化。您应该等待一段时间,然后监控您的瓶颈到底在哪里。

    【讨论】:

    • +1 用于提及“[在测试前等待]”。过去不等待真的浪费了我很多时间。
    【解决方案2】:

    不会,它不会显着影响您网站的性能(除非您每秒有数百个用户)。

    但我注意到了一些事情:

    (...) 我将读取该用户的记录并构造一个字符串并分配给一个会话变量。当登录用户访问每个页面时,我会从 session 变量中读取值,然后解析字符串 (...)

    啊哈!看,会话只不过是在session_start() 上编码和解析的字符串(通常,serialize()unserialize() 用于此目的)。您无需手动对要存储在会话中的数据进行编码,它已经为您完成(并且 definitley 比任何自定义方法都更快,因为这些功能是在核心中实现的)。

    【讨论】:

    • 对不起。我忘了说这是一个 PHP 应用程序。
    【解决方案3】:

    如果您使用native session handler of PHP,那么无论您是否访问会话数据,在每次使用会话时都可能会检索会话数据。并且作为default session handler uses files 来存储数据,它也会导致在每次请求时读取文件。

    如果您想对此进行优化,您可以使用某种缓存来存储会话。可能是内存缓存,例如 APCMemcache(另请参阅 this comment to the session_set_save_handler function)。

    【讨论】:

    • apc 还提供共享键/值内存访问。更快,如果你只有一台服务器,如果有更多,就会有问题。
    • php.net/manual/en/ref.apc.php(我的意思是,它比 memcache 快,但不可扩展)
    【解决方案4】:

    补充格雷格上面所说的内容。

    php 中有两种类型的会话。存储在数据库中的会话和存储在文件中的会话(通常在 /tmp/session_something 中);

    数据库选项在创建套接字和发送/检索数据方面有开销。它具有诸如会话能够跨多个服务器/机器持久性等优点。

    将会话信息存储到文件中的第二个选项可能是性能最佳的选择,因为像 Linux 这样的操作系统可以缓存/缓冲对内存中文件的读写操作。

    所以简短的回答是,甚至不用担心开销什么的,不是为了引诱,但如果你真的关心性能,你就不会使用 PHP。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      相关资源
      最近更新 更多