【问题标题】:Are php sessions stateless or not? [closed]php会话是无状态的吗? [关闭]
【发布时间】:2014-05-28 21:38:56
【问题描述】:

我知道这个问题被问过很多次关于在 RESTful SPI 中使用 php 会话的问题,但答案通常是 php 会话在多个请求中保留状态,因此不是无状态的,因为我对这个说法有疑问,所以我想反驳它并得到好的答案:

如果我对 php 会话的理解正确,它们就是这样工作的:

  • 当用户请求涉及会话处理的资源时 生成会话 ID 并提供给他。
  • 用户有责任将此会话 ID 发送到服务器以处理任何后续请求, 这通常由用户代理通过 cookie 或附加会话 ID 参数来完成
    到网址。

因此,服务器上不会保存任何应用程序状态信息,并且 php 会话是无状态的,因为会话 id 由客户端保存,而不是服务器。

当然,还有保存在服务器上的会话文件,因此是保留状态。但是在此会话文件上保存信息或将其保存在数据库中有什么区别?会话与否,一些数据保存在服务器上,其中一些(或全部)仅与某个用户或一组用户相关。

以国际象棋为例。假设所有游戏逻辑都在 php 文件中实现。士兵位置保存在表格中。玩家必须以某种方式识别以告诉服务器下一步要做什么。现在假设士兵位置保存在会话文件中。玩家要再次识别,这个场景和db表场景有什么不同吗?

编辑: 感谢您的好答案,他们提出了另一个问题:基于会话的应用程序(例如上一段中的国际象棋游戏)可以实现为 RESTful 服务吗?

【问题讨论】:

  • 那么你的问题是在服务器文件和数据库表中存储会话值有什么区别吗?
  • 如果你在会话数据中保存了士兵的位置,其他玩家怎么知道棋子在哪里?
  • 实现方式不同,但我发现数据库样式会话更具弹性。 shiflett.org/articles/storing-sessions-in-a-database 并回答您最初的问题 - 会话在实践中 是无状态的。
  • @Pitchinnate,我的问题是这篇文章的标题:“php 会话是否是无状态的?”其余的只是为了清除我的地位。
  • @YekhezkelYovel 会话允许您在无状态环境中拥有状态。单个 http 请求是无状态的,但会话允许您在这些请求中拥有持久数据。

标签: php mysql rest session cookies


【解决方案1】:

对于存储树的小实现细节,您错过了大森林图。

建立会话的行为意味着服务器有一个状态。这个状态存储在哪里是无关紧要的。会话可能超时的事实意味着存在状态。只有当我可以随时重复相同的请求并始终收到相同的答案时,API 才是无状态的。如果我必须在发送请求之前与服务器建立会话,并且此会话仍需要处于活动状态,否则我的请求可能会被拒绝,那么我可以any 发送我的请求 时间,但仅在有活动会话的时候,因此服务器不是无状态的。

现在,如果会话对请求完全没有影响,并且无论客户端是否跟踪会话 cookie 并且无论会话状态如何,他的请求都会得到响应,那么这将是一个无状态服务器.还有一个毫无意义的会议。

【讨论】:

  • 首先感谢您的回复。所以,如果我理解正确,国际象棋示例将无法作为 RESTful 服务实现,对吗?
  • 仅仅信息被存储这一事实并不表示状态。会话专门在服务器和特定用户之间建立特定的临时状态。那是一个有状态的 API。您可以为您的国际象棋游戏制作一个完美的无状态 API,其中游戏的状态在每个请求的请求正文中发送;只要任何人都可以随时发送相同的请求并收到相同的答案,这也是一个无状态 API。数据存储在哪里并不重要,重要的是如何使用 API。
  • 另外,不要把“收到相同的答案”当成服务器上的数据存储永远不能改变。如果你有你的国际象棋游戏并且游戏进度都存储在服务器上的数据库中,那么我当然可能在任何时候询问游戏状态时都会收到不同的响应内容,因为游戏可能已经在与此同时。但是,每次我询问游戏状态时,我总是会收到相同的种类答案;我永远不会在无状态 API 中收到 “您的会话已过期” 答案。
  • 我明白了。非常感谢,您为我解决了这个问题。
【解决方案2】:

就服务器上没有保存应用程序信息而言,这是错误的。会话数据保存在服务器上。唯一保存在客户端机器上的是会话 cookie。

您可以判断某事是否是无状态的,因为您将无法返回上一步(每个步骤都被视为一个独立的事务[cite])。对于会话,这正是他们允许您做的事情。例如,如果您在电子商务网站上的购物车中有商品,您可以关闭您的机器,稍后再回来查看这些商品仍在您的购物车中。那就是状态保存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-19
    • 2023-04-01
    • 1970-01-01
    • 2011-10-14
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多