我一直在阅读手册和网页上的各种页面,包括很多关于SO的问题.但是,我仍然无法session_destroy()理解PHP中的概念以及其他未设置会话数据的方法.
对于从未在$_SESSION超全局数组外部注册会话变量的站点,请考虑这一点.
session_start();
$_SESSION = array();
session_regenerate_id(true); // New cookie + old session file on server deleted
session_destroy(); // What does PHP do here that was not done above?
Run Code Online (Sandbox Code Playgroud)
请注意,我已经构建了多年的工作登录注销脚本.这个问题不是要让事情发挥作用,而是我想要准确理解发生了什么.
(SO上的很多答案也使用session_unset()了取消注册变量.但是,我从不使用session_register(),所以这看起来真的很多.)
该session_regenerate_id()功能旨在根据其相应的标识符复制或移动会话数据。通常在用户登录以防止会话固定时使用。之后,会话仍处于活动状态,可以使用进行访问$_SESSION。
将session_destroy()删除当前会话数据。之后,会话消失了,您只能使用来开始新的会话session_start()。
如果用户退出您的站点,最适当的操作是完全销毁会话;即使用session_destroy()。
顺便说一句,session_register()和session_unset()已弃用,不应使用。
让我们追根溯源。字面上地。
session_destroy()和session_regenerate_id()均在PHP 源代码的ext/session/session.c中实现。通过快速阅读可以明显看出,如果将 true 传递给session_regenerate_id,它会在底层会话保存处理程序上调用s_destroy,这与 所做的调用完全相同session_destroy。根据 svnblame 的说法,这种行为至少自 2005 年以来一直保持不变。
session_destroyphp_rshutdown_session_globals确实对和进行了两次额外的调用php_rinit_session_globals。除此之外,这会导致session_destroy()调用保存处理程序中的关闭函数,但无论如何,这都是在请求完成时自动完成的(请参阅PHP_RSHUTDOWN_FUNCTION)。它还将会话重置为非活动状态(就像调用之前一样session_start),这可以通过调用session_status()(在 php 5.4 中引入)看到。
所有这一切的好处是,您永远不必在调用session_destroy 之前session_regenerate_id(true)调用。但是,如果您想重置会话,您仍然必须在之后调用它,因为否则会话仍将处于活动状态,并且$_SESSION当请求完成时,保存处理程序将把当前内容写入存储。