php会话是无状态还是没有?

时间:2014-05-28 13:16:30

标签: php mysql rest session cookies

我知道这个问题多次被问及在RESTful SPI中使用php会话,但答案通常是php会话在多个请求中保持状态,因此不是无状态的,因为我对此声明有疑问我想反驳并得到好的答案:

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

现在,如果会话对请求完全没有影响,并且无论客户端是否跟踪会话cookie并且无论会话状态如何都会回答他的请求并不重要,那就是无状态服务器。而且这是一次毫无意义的会议。

答案 1 :(得分:2)

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

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