Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php会话是否是无状态的?_Php_Mysql_Rest_Session_Cookies - Fatal编程技术网

php会话是否是无状态的?

php会话是否是无状态的?,php,mysql,rest,session,cookies,Php,Mysql,Rest,Session,Cookies,我知道,关于在RESTful SPI中使用php会话,这个问题被问了很多次,但答案通常是php会话在多个请求中保持状态,因此不是无状态的,因为我对这一说法有疑问,我想反驳它并得到好的答案: 如果我对php会话理解正确,那么它们就是这样工作的: 当用户请求涉及会话处理的资源时 生成会话id并提供给他 用户负责将此会话id发送到服务器,以便进行任何后续请求, 这通常由用户代理通过cookie或附加会话id参数来完成 链接到url 因此,服务器上永远不会保存任何应用程序状态信息,php会话是无状态

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

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

  • 当用户请求涉及会话处理的资源时 生成会话id并提供给他
  • 用户负责将此会话id发送到服务器,以便进行任何后续请求, 这通常由用户代理通过cookie或附加会话id参数来完成
    链接到url
因此,服务器上永远不会保存任何应用程序状态信息,php会话是无状态的,因为会话id是由客户端而不是服务器保存的

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

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

编辑:
感谢这些好的答案,它们引出了另一个问题:基于会话的应用程序(如上一段中的国际象棋)能否作为RESTful服务实现?

您缺少了存储树的小实现细节的大森林图

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


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

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

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


现在,如果会话对请求没有任何影响,客户端是否跟踪会话cookie也无关紧要,并且无论会话状态如何,请求都会得到响应,那么这将是一个无状态服务器。而且是一个毫无意义的会话。

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


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

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


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

那么你的问题是,在服务器文件和数据库表中存储会话值有什么区别吗?如果你在会话数据中保存了士兵的位置,其他玩家如何知道碎片在哪里?实现方式不同,但我发现数据库样式的会话更具弹性。为了回答您最初的问题-会话实际上是无状态的。@首先,我的问题是这篇文章的标题:“php会话是否是无状态的?”其余的只是为了澄清我的立场。@YekhezkelYovel会话允许您在无状态环境中拥有一种状态。单独的http请求是无状态的,但是会话允许您在这些请求之间拥有持久数据。那么您的问题是,在服务器文件和数据库表中存储会话值有什么区别吗?如果您在会话数据中保存士兵位置,另一个玩家怎么知道这些部分在哪里呢?实现是不同的,但我发现数据库风格的会话更具弹性。为了回答你最初的问题,会话实际上是无状态的