相关
Sessions - Sessions and Statefullness
Sessions - Sessions are Stateful, PHP user code is not
Sessions - Where to use session_start()
Sessions - Statefullness and Runs
PHP.net
Specefic Two ID问题
答案 0 :(得分:2)
如何确定导致session_start创建新会话的机制是什么,而不是恢复之前的会话?
这在session_start
function的PHP源代码中可见。您需要阅读C代码并与您的使用情况进行比较。
根据我对会话的了解,session_start
如果已经有一个会话,则不会启动新会话。要了解会话是否已处于有效状态,请参阅How to tell if a session is active?。
但是,如果会话已启动(并且之前不存在)然后关闭并且您在同一请求中创建新会话,则PHP可能会认为会话不存在(因为来自浏览器的cookie仍然存在空)。那么第二个也是新的会话将会开始。
如果您不确定该做什么,只需创建一个测试脚本,您可以在其中使用场景。
可能的情况:
session_start()
被调用。没有会话cookie,PHP将创建一个新的会话ID,并将创建cookie头。session_start()
被调用。没有会话cookie(在请求中),PHP将创建一个新的会话ID并将创建cookie头。已创建两个会话,其中一个会话将不被浏览器用于后续请求(cookie的会话ID标头已被“覆盖”(最后一个cookie标头替换了之前的cookie)。 / p>
要调试内容,headers_list
和$_COOKIES
一样有用。
答案 1 :(得分:1)
让我解释会话是如何工作的,PHP将变量保存在服务器端的某个地方(为了解释这个问题并不重要),并使用唯一的id(即会话ID < / strong>),然后以两种方式之一向用户提供会话ID:
example.com/index.php?sid=acd6e41ac5ae1dc6ae15dec56
)在下一个请求中,PHP将希望收到该ID(以上述两种方式之一),并将其与服务器端的会话ID列表进行匹配。找到匹配项后,PHP将加载会话环境(由作者使用$_SESSION
super global访问)。
您描述了PHP找不到匹配项的问题,并生成新的会话ID而不是继续使用现有的会话ID。这可能意味着客户端将会话ID发送到服务器的方式存在问题。
这将意味着两个问题之一:
example.com
而不是example.com/index.php?sid=acd6e41ac5ae1dc6ae15dec56
)。检查这两个,它可能不是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启动会话。