php 会话是否无状态?

Yek*_*vel 0 php mysql cookies rest session

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

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

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

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

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

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

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

dec*_*eze 5

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

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

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