PHP中的session_destroy()函数是什么意思?

6
在PHP手册中,session_destroy() 函数的描述如下:

session_destroy()函数会销毁与当前会话相关联的所有数据。但它不会取消设置与会话关联的全局变量或取消会话cookie。如果要再次使用会话变量,则必须调用 session_start() 函数。

这段描述可能会让人感到困惑。如果此函数销毁所有会话数据,为什么与会话相关的全局变量没有被取消?我们为什么可以再次使用会话变量呢?

我认为您错过了同一页下面的以下段落:为了完全终止会话,例如注销用户,还必须取消设置会话ID。如果使用cookie来传播会话ID(默认行为),则必须删除会话cookie。可以使用setcookie()函数来实现。 - Satya
如果这个函数会销毁所有的会话数据,那么为什么与会话相关的全局变量没有被取消设置呢?因为这样做没有意义。全局变量将在下一次请求时消失。 - Pekka
你认为与该会话相关联的全局变量不再与该会话相关联,因为该会话已被销毁。你可以将这些变量用作变量,但不能用作会话变量。没有理由也不必销毁这些变量,所以你可能应该在问题中添加为什么认为需要销毁它们,这样更清楚地表达你的问题。也许你需要帮助解决某个具体的问题? - hakre
2个回答

5
我对这段描述感到困惑。如果这个session_destroy()函数可以销毁所有会话数据,那么与会话相关的全局变量为什么没有被取消设置?为什么我们还能再次使用会话变量?
会话数据是与会话相关的数据。会话由其名称(会话名称)和ID(会话ID)定义。
通过使用该函数,所有此会话(名称+ID)数据都将被销毁。
允许您读取/设置该数据的变量容器仍然存在,因此您可以对该数据进行操作(例如,可能会有一些信息,例如最后一次活动记录在内,这是注销,并且您希望将最后一次活动记录在注销时存储在某些日志或数据库中,那么为什么要删除它?那将是适得其反的,因为您想快速销毁(或提交)会话,例如当您知道仅需要只读访问时,将会话数据保留在内存中,但已经提交会话,因为没有必要保持它处于打开状态)。
请记住,即使通过 $_SESSION 访问这些变量,它们也不再是会话的一部分。也许这就是令人困惑的部分?
顺便说一句,我的描述并不完全正确。 PHP在内部仅通过ID标识会话数据,因此您可以更改会话名称, session_destroy()仍将删除会话数据,因为会话ID未更改。

谢谢您的回答。我最初误解了描述。我把会话数据和会话变量搞混了。 - PixelsTech

2

session_destroy()函数会删除存储有会话数据的会话文件。具体请参见:

<?php

session_save_path('./session/');

session_start();
$_SESSION['v'] = array( 'foo' => 123, 'bar' => 'spam' );
$_SESSION['m'] = "rocky";

if( isset($_GET['delete']) == 'true' )
    session_destroy();

?>

我有一个脚本,它创建一个会话并将v的值设置为10,然后它将会话数据保存在文件夹./session中,该文件夹位于同一脚本路径下。
现在打开页面,然后浏览./session目录,你应该会看到一个类似于sess_4r7ldo7s5hsctu3fgtvfmf4sd0的文件。这就是存储会话数据的位置,它将包含:
v|a:2:{s:3:"foo";i:123;s:3:"bar";s:4:"spam";}m|s:5:"rocky";

通过向页面传递?delete=true,来激活session_destroy()函数,会简单地删除会话文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接