6

在 PHP 手册中,session_destroy()函数的描述是:

session_destroy() 销毁与当前会话关联的所有数据。它不会取消设置与会话关联的任何全局变量,也不会取消设置会话 cookie。要再次使用会话变量,必须调用 session_start()。

我对这个描述感到困惑。如果这个函数破坏了所有会话数据,那么为什么与会话关联的全局变量没有取消设置?为什么我们可以再次使用会话变量?

4

2 回答 2

5

我对这个描述感到困惑。如果这个 [ session_destroy()] 函数破坏了所有会话数据,那么为什么与会话关联的全局变量没有取消设置?为什么我们可以再次使用会话变量?

会话数据是与会话关联的数据。会话由其名称(会话名称)和它的 ID(会话 ID)定义。

通过使用该函数,所有这些会话(名称 + id)数据都将被销毁。

允许您读取/设置该数据的变量容器仍然存在,因此您可以对该数据进行操作(例如,可能有类似上次活动的信息,这是一个注销,您想存储在注销时知道的最后一个活动或所以进入一些日志或数据库,为什么要删除它?这会适得其反,因为您想快速销毁(或提交)会话,例如,当您知道只需要只读访问时,将会话数据保留在内存中,但提交会话已经因为没有必要保持打开状态)。

请记住,即使这些变量也可以通过$_SESSION它们不再是会话的一部分来访问。也许这是令人困惑的部分?

顺便说一句,我的描述并不完全正确。PHP 在内部仅通过 id 标识会话数据,因此您可以更改会话名称,session_destroy()但仍会删除会话数据,因为会话 id 没有更改。

于 2013-08-31T14:59:07.890 回答
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();

?>

我有一个脚本,它创建一个会话并将值设置v10,并将会话数据保存在一个名为 的文件夹中的相同脚本路径中./session

现在打开页面,然后浏览./session目录,您应该会看到一个名称类似于sess_4r7ldo7s5hsctu3fgtvfmf4sd0. 这是存储会话数据的地方,它将包含:

v|a:2:{s:3:"foo";i:123;s:3:"bar";s:4:"spam";}m|s:5:"rocky";

session_destroy()通过传递?delete=true到页面激活,会话文件将被简单地删除。

于 2013-08-31T14:54:32.587 回答