session_destroy()在PHP中做什么


What does session_destroy() do in PHP?

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

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

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

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

会话数据是与会话相关联的数据。会话由其名称(会话名称)和id(session id

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

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

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

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

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(),会话文件将被简单删除。