代码之家  ›  专栏  ›  技术社区  ›  user3425506

PHP中的会话存储与非会话存储

  •  0
  • user3425506  · 技术社区  · 2 年前

    作为实现网站用户名/密码身份验证工作的一部分,我正在使用PHP会话。我读了一篇非常有趣的文章,名叫 PHP Sessions in Depth

    文章中没有提到的一件事(因为它不适合像我这样的新手)是,为什么数据会存储在会话中,而不是存储在非会话数据库中,而不仅仅是为了知道会话针对的是哪个用户。

    例如,以下是会话存储中可能存在的数据示例:

    [ "theme" => "blue", 
      "volume" = >100]
    

    这篇文章继续讨论当会话存储中大量此类数据发生更改时可能导致的竞争条件。我想知道的是,为什么不将其与用户的ID一起存储在非会话存储数据库中。只有用户的ID也会存储在会话存储中,以便在http请求之间保持不变?我采取了后一种方法,但我的网站非常简单,我想知道如果它们变得更复杂,我是否会遇到问题。

    1 回复  |  直到 2 年前
        1
  •  1
  •   IMSoP    2 年前

    你是绝对正确的。直接在会话中存储过多数据可能会导致多个问题:

    • 性能,因为PHP在保存时将整个季节序列化为字符串,并在下一页加载时取消序列化
    • 过时的数据,如果会话不是某些信息的“真相来源”,则只是从其他地方(如主数据库)检索的额外数据副本

    比赛条件本身通常不是比赛的问题 按设计 ,因为它们将在请求的整个期间被“锁定”。如果同一用户同时发出两个请求,则第二个请求只等待第一个请求完成并解锁会话。但是,如果您编写自己的会话处理程序而不锁定,或者大量使用 session_start session_write_close ,你不会有这样的保证。

    将额外数据放入会话的主要原因是将其用作一种缓存:如果每个页面的顶部都写着“Hello$username”,则将用户名和ID存储在会话中可以节省每次访问数据库的往返时间。因此,需要找到一个平衡,你不能100%地说存储绝对最小值总是最优的。