我决定从基于 PHP 的本地会话管理切换$_SESSION
到使用我自己的会话管理,因为到目前为止我在 PHP 的可能性方面遇到了许多不同的问题,也因为我正在构建一个必须与移动应用程序请求兼容的 API ; $_SESSION
所以无论如何我都不能依赖。我知道有 symfony 之类的框架可以解决这个问题,但是对这些婴儿操作使用这样的东西就有点过分了。
因此,我目前正在实施的是根据这个逻辑(来源):
我想知道的最后一点是,Redis / 链接的文章建议在第一次成功的身份验证(如登录或类似身份)之后“存储会话和用户信息”。但是,我认为不这样做会更有益,并且只存储会话标识符,有点像允许客户端在 Web 应用程序的安全区域中启动请求的 VIP 卡。
我的想法就是这样:
- 无论如何,大多数相关的用户信息都以未加密的形式存在于数据库中;大多数甚至在单个数据库表中。
- 我认为将相同的数据存储在数据库的多个位置通常是一种不好的做法,即使在这种意义上存储一个数据是为了“更快”或“促进”访问。
- 整个用户信息 (=平台所有可能的 REST 请求所需的所有数据,收集在一个 JSON 中)涵盖大约 50 个键值对,其中一些值是加密的,所以我还需要加密生成的用户info,导致对每个请求(和页面加载,也用于身份验证)进行巨大的加密/解密操作,以及相应的附加列,例如
VARBINARY(600)
. - 对于一个请求,我从不需要超过 10 个 kv 数据,而且大多只需要 2-3 个。
考虑到上述考虑,我想知道:沿着会话标识符存储整个用户信息(我需要在平台的所有 REST 请求中的所有用户数据的总和)来模拟,这不是完全矫枉过正和大量数据传输吗?一个会议?仅将会话标识符存储在数据库中,并在实际请求进入时仅查询所需的用户信息不是更好吗(上面 img 的步骤 4a)?这不是更有意义吗?
如果我将整个用户信息与会话标识符一起存储,我只是觉得浪费了这么多资源。因为这也意味着我会为不同的请求解密和发送大量的有效载荷,但这是徒劳的。
那么这里有什么更好的做法,在身份验证时存储用户信息(步骤 1b)或在对请求进行身份验证时检索它(步骤 4b)?
给你一个想法;由此产生的权衡需要在以下之间进行:
- 每次请求都解密数据并发送比端点实际需要的更多的用户信息
VS
- 平均而言,在每次页面加载/请求时对主键执行至少 2 次联接,最终在该查询中也进行 1-2 次较小的解密。
在性能方面,我对这里更聪明的东西一无所知..
另一个权衡是编码的便利性,因为不将整个会话数据集存储在数据库中意味着每个 REST 调用都有一个特定的用户信息数据库请求。
[这是“意见”和“经验”的交叉。YMMV。]
我毫不犹豫地对一个网页的数据库进行 40 次查询。所以,我可能会发送一个 id,而不是 kv 中的 40 个项目。
一个网页需要一个连接。第二个网页需要一个新的连接。从一个页面传递到另一个页面的信息必须通过 cookie、URL 或
$_SESSION
.$_SESSION
(与序列化一起,如果需要)是在页面之间保存信息的一种方法。但是,...它仅适用于小型站点,因为 Session 数组仅保留在一台服务器上。用于
microtime(true)
查看每个数据库操作需要多长时间。大多数将在 10 毫秒以下。任务中最慢的部分可能是客户端和服务器之间的网络。所以尽量避免发送不需要的数据。
(我不是 REST 的粉丝。)
JSON 可用于传递 kv 信息,甚至可以将其存储在数据库中。但不打算搜索 kv 的任何内容。获取具有多列的行很容易,然后
json_encode()
将其转换为 kv。如果您可能有 UTF-8 文本,我建议添加 flag
JSON_UNESCAPED_UNICODE
。