为什么需要session_ destroy()?

时间:2012-03-02 18:49:45

标签: php session session-cookies

session_destroy()函数有什么作用?要删除全局数组$ _SESSION中的所有会话变量,我必须使用session_unset()。要从客户端浏览器中删除会话(删除会话ID和名称),我必须取消设置cookie:

unset($_COOKIES[session_id()]);
unset($_COOKIES[session_name()]);

为什么需要session_destroy()功能?

1 个答案:

答案 0 :(得分:11)

session_destroy()结束整个会话,这意味着它将从PHP的会话存储中删除,不能再次使用。如果您只取消设置会话变量和cookie,则会话仍然是活动服务器端,如果再次设置某些会话变量并且具有原始会话ID的cookie再次发送到客户端,则可能会被回收。

以另一种方式表达:会话基本上由存储在Web服务器某处的秘密ID以及注册到该会话的会话变量组成。会话ID被发送到客户端(通常作为cookie),因此客户端可以在以后的请求中被识别为会话的“所有者”。假设已经创建了一个会话并且已经注册了变量,这里概述了这些函数的作用:

  • session_start()导入属于客户端从会话注册表发送到$_SESSION数组的会话ID的所有会话变量
  • session_unset()或在unset()变量上调用$_SESSION将清除当前会话中注册的所有变量,但 清除会话本身
  • 取消设置客户端的会话cookie会向客户端发出会话已结束的信号,但 将从服务器上的会话注册表中删除该会话
  • session_destroy()是实际从会话注册表中清除会话的唯一函数,因此字面上“破坏”会话

虽然session_destroy()将取消注册所有会话变量,但它不会清除当前正在执行的脚本中的$_SESSION数组,因此取消设置会话变量以防止错误和安全性仍然是个好主意的问题。

在相关的说明中,PHP手册建议不要使用session_unset(),而是取消设置$_SESSION的密钥:

  

如果使用$_SESSION(或{4.0}或更低版本的$HTTP_SESSION_VARS),请使用unset()取消注册会话变量,即unset($_SESSION['varname']);