如何解决会话问题?

时间:2011-12-26 17:26:48

标签: php session

3 个答案:

答案 0 :(得分:2)

  

如何确定导致session_start创建新会话的机制是什么,而不是恢复之前的会话?

这在session_start function的PHP源代码中可见。您需要阅读C代码并与您的使用情况进行比较。

根据我对会话的了解,session_start如果已经有一个会话,则不会启动新会话。要了解会话是否已处于有效状态,请参阅How to tell if a session is active?

但是,如果会话已启动(并且之前不存在)然后关闭并且您在同一请求中创建新会话,则PHP可能会认为会话不存在(因为来自浏览器的cookie仍然存在空)。那么第二个也是新的会话将会开始。

如果您不确定该做什么,只需创建一个测试脚本,您可以在其中使用场景。

可能的情况:

  1. 浏览器发送请求
  2. PHP启动
  3. session_start()被调用。没有会话cookie,PHP将创建一个新的会话ID,并将创建cookie头。
  4. 你关闭了会话。
  5. session_start()被调用。没有会话cookie(在请求中),PHP将创建一个新的会话ID并将创建cookie头。
  6. 已创建两个会话,其中一个会话将不被浏览器用于后续请求(cookie的会话ID标头已被“覆盖”(最后一个cookie标头替换了之前的cookie)。 / p>

    要调试内容,headers_list$_COOKIES一样有用。

答案 1 :(得分:1)

让我解释会话是如何工作的,PHP将变量保存在服务器端的某个地方(为了解释这个问题并不重要),并使用唯一的id(即会话ID < / strong>),然后以两种方式之一向用户提供会话ID:

  1. 通过网址(example.com/index.php?sid=acd6e41ac5ae1dc6ae15dec56
  2. 中的GET变量
  3. 通过标题中发送的Cookie。
  4. 在下一个请求中,PHP将希望收到该ID(以上述两种方式之一),并将其与服务器端的会话ID列表进行匹配。找到匹配项后,PHP将加载会话环境(由作者使用$_SESSION super global访问)。

    您描述了PHP找不到匹配项的问题,并生成新的会话ID而不是继续使用现有的会话ID。这可能意味着客户端将会话ID发送到服务器的方式存在问题。

    这将意味着两个问题之一:

    1. 用户访问的网站没有包含会话ID的GET变量:(example.com而不是example.com/index.php?sid=acd6e41ac5ae1dc6ae15dec56)。
    2. 用户没有启用Cookie或在其会话之间删除了Cookie。
    3. 检查这两个,它可能不是PHP引擎中的问题。

答案 2 :(得分:0)

在php.net session_id()

  

在我的案例中每次有一个新的session-id时,在PHP版本5.3.2中   在session_start()之后生成,但所有都正常工作   在以前的版本中。所以我从当前会话中丢失了数据(错误   会话ID)。总有$ _POST或$ _GET或$ _COOKIE可用   使用session-name和session-id,因此使用了session_start()   这是自动的。现在我必须执行session_id(.. old id ..)   在session_start()之前,为相同的id启动会话。