PHP中未设置($ _ SESSION []),session_unset()和session_destroy()之间的区别

时间:2015-04-17 05:22:20

标签: php session

我需要关于php中的会话的帮助

我试过这段代码

<?php 
session_start();
$_SESSION['one'] = "Hello";
$_SESSION['two'] = "World";
$_SESSION['three'] = "Welcome to session";
var_dump($_SESSION);

打印

array (size=3)
  'one' => string 'Hello' (length=5)
  'two' => string 'World' (length=5)
  'three' => string 'Welcome to session' (length=18)

然后我取消了会话一次

unset($_SESSION['one']);
echo "Session one unset and only session two and three exist";
var_dump($_SESSION);

打印

Session one unset and only session two and three exist
array (size=2)
  'two' => string 'World' (length=5)
  'three' => string 'Welcome to session' (length=18)

然后,如果我销毁会话

session_destroy();
echo "Session Destroyed <br />";
var_dump($_SESSION);

但没有任何反应,我仍然可以打印会话

Session Destroyed 
array (size=2)
  'two' => string 'World' (length=5)
  'three' => string 'Welcome to session' (length=18)

但如果我再次使用session_destroy();,它会给我一个警告

  

警告:session_destroy():尝试销毁未初始化的会话

如果我使用未设置

,而不是session_destroy()代码
session_unset('two');
echo "Session two unset";
var_dump($_SESSION);

所有会话变量都未设置,我无法访问会话三变量 它打印

Session two unset
array (size=0)
  empty

如果我使用session_unset('two');,而不是使用session_unset();,那么我也会给出相同的结果。

那么unset($_SESSION['one'])session_unset('one')session_unset()session_destroy().

之间的实际差异是什么?

我用google搜索它,到处都得到session_destroy()用于销毁整个会话的答案(但在上面的代码中我仍然可以访问会话变量)并且session_unset('one')仅用于取消设置单个会话varbele(但在上面的代码中,如果我使用session_unset('one'),所有会话变量都会被取消)。

所以,请帮助我了解会话的工作原理,以及在记录用户session_unset()session_destroy()时应使用的代码。

3 个答案:

答案 0 :(得分:3)

使用session_destroy()后,会话cookie被删除,会话不再存储在服务器上。 $_SESSION中的值可能仍然可用,但它们不会出现在下一页加载中。

根据PHP

void session_unset ( void )

session_unset()函数释放当前注册的所有会话变量,不带任何参数。

unset($_SESSION['name']);将仅删除名称数据。

答案 1 :(得分:3)

非常简单,

session_unset - 释放所有会话变量,但会话ID不会被销毁

session_destroy - 销毁注册到会话的所有数据,调用此函数的第一个会话应该注册。

取消设置($ _ SESSION ['VARIABLE_NAME']) - 这将取消您传递的变量值。

在您的示例中,直接调用 session_destroy()是不正确的,因此您可以看到会话中存在的变量值,您可以为已注册的会话调用session_destroy。

由于 阿米特

答案 2 :(得分:1)

我猜它已被破坏但内存尚未发布,所以你仍然可以看看它。而unset将其设置为null。