6

我一直在阅读手册和网络上的各种页面,包括关于 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?

请注意,多年来我已经构建了有效的登录-注销脚本。这个问题不是关于让事情正常进行,而是我想确切地了解正在发生的事情。

(关于 SO 的很多答案也使用session_unset()which unsets registered variables。但是,我从不使用session_register(),所以这似乎真的是多余的。)

4

2 回答 2

5

session_regenerate_id()功能旨在根据其相应的标识符复制或移动会话数据;它通常在用户登录以防止会话固定时使用。之后,会话仍然处于活动状态,可以使用$_SESSION.

删除当前session_destroy()会话数据。之后,会话消失了,您只能使用session_start().

如果用户退出您的站点,最合适的操作是完全销毁会话;即使用session_destroy().

顺便说一句,session_register()并且session_unset()已弃用且不应使用。

于 2013-08-16T06:38:06.260 回答
4

让我们去源头。字面上地。

session_destroy()session_regenerate_id()都在 PHP 源代码的ext/session/session.c中实现。从快速阅读中可以明显看出,如果您将 true 传递给,它会在底层会话保存处理程序上session_regenerate_id调用s_destroysession_destroy ,这与. 根据 svn 的责备,这种行为至少自 2005 年以来一直保持不变。

session_destroy确实对php_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当请求完成时,保存处理程序的当前内容将被写入存储。

于 2013-08-16T05:24:32.667 回答