Session

Session默认通过文件形式存储

当用户访问首次服务端时(不管你是否访问session)都会自动生成一个PHPSESSID 并存入Cookie 键名为PHPSESSID
存的一个a0rj6402d7v7qgk62k76nkiha2这种值
可以直接 echo $_COOKIE['PHPSESSID']; 查看此值
这个值有什么用呢?

这个值就是服务端session文件的文件名 ( 去掉sess_部分 )
当你访问服务端则自动生成一个PHPSESSID 这时服务端的对应session文件并不存在
而是当你首次执行session_start();时根据之前生成的PHPSESSID值自动创建一个session文件
文件名为: sess_加上之前生成的PHPSESSID值 : sess_a0rj6402d7v7qgk62k76nkiha2

当以后设置或读取session时
都会将此PHPSESSID值发送给服务器到服务器的session目录下找到对应的session文件进行操作
为什么关闭浏览器后$_SESSION中值会消失?

上面说到每次操作session都会把PHPSESSID传给服务器 然后到服务器的session目录下寻找对应session文件
PHPSESSID是存于Cookie中的 默认是没设置有效时间
也就是关闭浏览器后就自动删除了PHPSESSID
所以当下次在打开浏览器时无法找到PHPSESSID
如果PHPSESSID不存在了 则会自动重新分配一个新的PHPSESSID
所以之前的$_SESSION中的值就找不到了

也就是说每一次会话(重新打开浏览器为一次会话)会产生一个新的PHPSESSID
也就会重新创建一个以新PHPSESSID命名的session文件 之前的session不再继续使用

那么如果我们手动去设置PHPSESSID的有效期呢
这样不就可以在下次重新打开浏览器时仍然可以找到PHPSESSID么

setCookie(session_name(),session_id(),time()+86400);
这样当关闭浏览器后 下次访问时仍然可以找到PHPSESSID 也就可以继续访问到$_SESSION中的值了

session_name() 表示sessionid的名字 也就是 PHPSESSID
session_id() 表示sessionid的值 也就是 $_COOKIE['PHPSESSID']的值

也可以通过 session_set_cookie_params(800); 函数设置session有效期 单位秒
放在 session_start(); 之前执行

当然你也可以把这个PHPSESSID值存入数据库
然后通过session_id($sessionid);设置PHPSESSID
客户端禁用了Cookie

其实这种用户可以直接忽略掉

禁用Cookie则无法存储PHPSESSID 所以每次都会因为找不到PHPSESSID 自动重新分配新的PHPSESSID

如果你理解了上面几段话 应该能想出解决办法
删除session

删除单个session
unset($_SESSION['xmg']);

删除所有session ( 删除当前内存中的所有session值 但不会删除session文件和释放sessionid )
session_unset();

释放此次会话的全部资源 ( 删除session文件 释放sessionid 但不会释放内存中的$_SESSION值 )
session_destroy();

也就是说执行session_unset()后就立即无法在访问$_SESSION中的数据了
而执行session_destroy()不会释放内存中的$_SESSION值 $_SESSION在本线程仍然可以访问

所以如果想删除所有session 执行 :
session_unset();
session_destroy();

不要尝试这样删除session : unset($_SESSION); 没这种写法 也删不掉session

原文地址:https://www.cnblogs.com/xin-jun/p/8461592.html