【问题标题】:How do I troubleshoot Issues with sessions?如何解决会话问题?
【发布时间】:2012-01-28 02:21:15
【问题描述】:

【问题讨论】:

  • 您在用户方面看到了哪些具体问题?会话变量没有被保存?这就是您认为 PHP 正在生成新会话而不是恢复的想法吗?用户是否有可能没有启用 cookie,或者正在删除他的 cookie?

标签: php session


【解决方案1】:

我如何确定导致 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 标头。

已经创建了两个会话,其中一个不会被浏览器用于后续请求(cookie 的会话 id 标头已被“覆盖”(最后一个 cookie 标头替换了相关 cookie 的前一个标头)。

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

【讨论】:

  • 就click the link,是php的lxr,有全部源代码。这与 Zend 最小库无关。
  • 这不是错误。如果您需要切换会话或更改会话 ID,这是预期的行为并且是实际需要的。
  • 哈哈,就像我写的那样,不存在会话 cookie ;)
【解决方案2】:

让我解释一下会话是如何工作的,PHP 将变量保存在服务器端的某处(为了解释起见,不管在哪里),并将其与唯一的 id 相关联(即 Session ID),然后它以以下两种方式之一将会话 ID 提供给用户:

  1. 通过 url 中的 GET 变量 (example.com/index.php?sid=acd6e41ac5ae1dc6ae15dec56)
  2. 通过在标头中发送的 Cookie。

在下一个请求中,PHP 将期望收到该 ID(以上述两种方式之一),并将其与服务器端的会话 ID 列表进行匹配。一旦找到匹配项,PHP 将加载会话环境(作者使用$_SESSION 超级全局访问)。

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

这意味着两个问题之一:

  1. 用户访问了没有包含会话 ID 的 GET 变量的站点:(example.com 而不是 example.com/index.php?sid=acd6e41ac5ae1dc6ae15dec56)。
  2. 用户没有启用 cookie 或在会话之间删除了他的 cookie。

检查这两个,不太可能是PHP引擎的问题。

【讨论】:

  • POST 也可以用php.net 记录。
【解决方案3】:

php.net session_id()下

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 2021-02-06
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2010-12-25
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多