session_unset()
释放当前在内存中已经
创建的所有
$_SESSION变量,但不删除session文件以及不释放对应的session_id。
不删除当前的会话id,意味着当前会话连接还保持着,意思就是在不关闭浏览器的情况下再创建别的session后继续使用该session_id来保持会话。
测试
- 创建方法
public function index(Request $request)
{
session_start();
$_SESSION['yy']=33333;
echo $_SESSION['yy']."\n";
dd(session_id());
}
- 在浏览器中访问该方法
可以看到当前会话id为ad4016bf675ab4736712d4bb0d8c2778

- 此时session_unset(),修改api
public function index(Request $request)
{
session_start();
session_unset();
echo $_SESSION['yy']."\n";
}
- 浏览器继续访问该方法
我们发现session变量yy已经被删除,符合上面说的:释放当前在内存中已经创建的所有$_SESSION变量

- 继续修改api
public function index(Request $request)
{
session_start();
session_unset();
dd(session_id());
}
- 浏览器继续访问该api,查看session_id是否被销毁
发现session_id存在,并没有被销毁,符合上面说的:但不删除session文件以及不释放对应的session_id

- 既然session_id没有被销毁,也就是说会话还保持着。
再写一个api接口
public function sessionId(){
session_start();
$_SESSION['kk']=5555;
echo ($_SESSION['kk']);
dd(session_id());
}
- 浏览器访问这个新接口
发现session_id和之前那个一样,此时session变量仍然使用之前那个session_id进行会话保持。

- 继续写另一个api
由于session_id可以继续使用,所以不关闭浏览器的情况下,测试session变量kk能否共享
public function getSession(){
session_start();
echo ($_SESSION['kk']);
dd(session_id());
}
- 浏览器访问getSession api。
发现使用的session_id是相同的,同时session也确实共享了,我们之前的猜想正确

- 做最后一个实验
最开始说的,会释放当前在内存中已经创建的所有$_SESSION变量,也就是session变量yy应该差不到了。修改api
public function getSession(){
session_start();
echo ($_SESSION['yy']);
}
-
继续访问上面的api
发现之前的session变量确实不存在了
image
总结
:session_unset()是删除了之前的所有session变量,但是session_id还是保持着,也就是说不关闭浏览器的情况下
,之后创建的session变量还是可以共享的。
session_destroy()
删除当前会话
对应的session文件以及释放session_id,但内存中的$_SESSION变量内容依然保留,但保留的这部分session变量已经没有session_id来保持会话了。
这里一定注意是当前会话,别的会话内的session_id并不会被删除
- 创建方法
public function index(Request $request)
{
session_start();
$_SESSION['yy']=33333;
echo $_SESSION['yy']."\n";
dd(session_id());
}
- 在浏览器中访问该方法
可以看到当前会话id为ad4016bf675ab4736712d4bb0d8c2778

- 创建另一个api
public function sessionId(){
session_start();
$_SESSION['kk']=5555;
echo ($_SESSION['kk']);
dd(session_id());
}
-
在浏览器中访问sessionId方法
image
可以看到俩个session变量都处于同一个session_id,也就是处于同一会话中。
- 此时在index方法中session_destroy();修改api
public function index(Request $request)
{
session_start();
session_destroy();
echo $_SESSION['yy']."\n";
dd(session_id());
}
- 使用浏览器访问该api
原来的session变量yy依然能访问,符合之前说的:发现内存中的$_SESSION变量内容依然保留
发现session_id已经被删除,是个空字符串。符合上面说的:删除当前会话
对应的session文件以及释放session_id。

- 浏览器重新访问第3步的api
在没有关闭浏览器的情况下,发现session_id还是之前的那个,刷新页面session_id也不会变,而且session变量kk依然能访问,且属于原来那个session_id。

重点是session_id并没有被删除,所以也就解释了:session_destroy只会删删除
当前会话
对应的session文件以及释放session_id,而不会删除别的会话的session文件以及释放session_id
之前认为使用session_destroy()后会彻底删除整个会话期间
的session_id,在不关闭浏览器的情况下,别的会话同样会得不到session_id。但是经上述验证,session_destroy只是会删除当前会话
的session_id,使其所在会话的session变量失效。也就是说session变量 yy没有了session_id,以至于在别的会话内是访问不到的,而后面的session变量kk是有session_id保持会话的,在同一session_id内的会话是可以访问session变量kk的。
为了验证上述俩个猜想,我们做以下俩个实验
- 重新写一个api,访问session变量yy
public function getSession(){
session_start();
echo ($_SESSION['yy']);
dd(session_id());
}
- 在没关闭浏览器的情况下访问其api
发现session变量yy确实访问不到了,因为yy已经没有session_id来保持了,验证上面的猜想。

- 最后做一个实验,看session变量kk是否能被访问
public function getSession(){
session_start();
echo ($_SESSION['kk']);
dd(session_id());
}
-
访问上述api
发现session_id是同一个id,说明在没关闭浏览器的情况下是同一个会话,所以seesion变量kk也同样能被访问到,猜想正确
image
总结:session_destroy()只会删除当前会话的session_id,使其当前会话内的session变量失效,而不会删除所有会话内的session_id,其他会话的session依然可以共享。
这里我们可以拿用户登录来说。当用户退出后,我觉得应该使用session_unset()来清除session,为什么?
用户退出后,清除了之前所有的session变量,但是该session_id还存在着,也就是说在浏览器没关闭之前
,用户是可以再次登录网站的,登录之后的session变量还是可以用之前的session_id来保持会话的。
如果使用session_destroy()来退出的话,只会清除当前会话
的session_id和变量,这显然不是我门需要的,我们需要的是删除所有的session变量。
网友评论