session_destroy()在PHP中做了什么?

时间:2013-08-31 14:27:21

标签: php session

在PHP手册中,session_destroy()功能的描述是:

  

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

我对此描述感到困惑。如果此函数销毁所有会话数据,那么为什么与会话关联的全局变量不会被取消?为什么我们可以再次使用会话变量?

2 个答案:

答案 0 :(得分:5)

  

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

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

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

允许您读取/设置该数据的变量容器仍然存在,因此您可以对该数据进行操作(例如,可能存在上次活动中的信息,这是注销,并且您希望存储最后一个活动在logout或者注销某些日志或数据库时,为什么要删除它?这会产生反效果,因为你想快速销毁(或提交)会话,例如当你只知道只读访问时,将会话数据保存在内存中,但已提交会话,因为无需保持打开状态。

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

BTW我的描述并不完全正确。 PHP仅通过id在内部标识会话数据,因此您可以更改会话名称,session_destroy()仍会删除会话数据,因为会话ID未更改。

答案 1 :(得分:1)

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();

?>

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

现在打开页面然后浏览./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,会话文件将被删除。