php之session详解

基本概念

由于http是无状态协议,所有每个会话必须用session来区分身份。php的session是被动GC来回收的,之后具体解释。

服务器里的session

在服务器中,session存在tmp中,以file类型存储。tmp的具体位置,在php.ini,中搜索:session.save_path,没被注释的就是真实地址,如下:

在这里插入图片描述

在tmp里的样子
在这里插入图片描述

  • 这个sess_6cb1pj3n6tnr6t3oqiv8dhptnc,就是存在服务器中的session文件,每个会话对应一个,文件里面包含了session的数据,例如$_SESSION['name']的值。

在这里插入图片描述

浏览器里的session

在浏览器中,并不会直接存储session文件,而是存储session_id,直接通过session_id可以找到在服务器里的session文件,来获取值。这是利用了cookie技术,还有url获取,这里不多赘述。
在这里插入图片描述

  • 在浏览器里,session的名字默认叫PHPSESSID,内容即6cb1pj3n6tnr6t3oqiv8dhptnc,和服务器里的可以对应。
echo session_id(); //浏览器里的session内容
echo session_name();  //浏览器里的session名字
echo session_save_path();  //服务端session的存储位置
回收机制

php里的session并不是一定会在浏览器关闭后就不能使用,首先session有个生命周期(就是文件的修改时间与现在时间的差额),超过这个时间才有可能被回收,这个时间是php.ini里的

在这里插入图片描述

另外,根据session.gc_probability=1,session.gc_divisor=1000,即1/1000=0.1的概率来执行。

重点: 通俗的说就是,每session请求一次服务器,首先会检查服务端的session文件有没有超过生命周期,只要超过生命周期,就会有0.1的几率删除超过生命周期的session文件,这里并不仅限当前会话的session,而是所有。

不管是否超过生命周期,只要没被GC,因为做了session请求,则会更新服务器端的session文件修改日期,导致生命周期又更新延长了。

而如果session请求时,文件超过生命周期,又刚好被GC了,则会整个session文件删除。

如果是第一次连接会话,没有session文件,则会创建一个新的。

具体例子:

  1. 如果单独把服务器的session删了,浏览器的没删,下次请求时,服务器会根据浏览器的保存的session内容重新建立一个;而如果把浏览器的session删了,服务器保存,浏览器则会新建立一个session,内容和之前的不同。
  2. 如果session请求服务器时,会话的session刚好被GC了,则不会立即在服务器创建新的session,第二次请求时服务器才会重新创建session。

当然即使服务端的session被GC了,浏览器端的PHPSESSID还是在的,即使把服务器的session删除了,下次服务器session创建时还是会叫这个名字,又可以找到了。

要把浏览器的消除,除了直接删除浏览器的cookies,还可以

setCookie("PHPSESSID","",time()-1,"/");
// 使用setCookie方法将PHPSESSID清空,过期时间为当前时间的前一秒

把PHPSESSID内容设置为空,并过期,这时浏览器会直接删除这个cookie,当然,重新请求一次服务器的session又有了,不过这时会在服务端重新建立一个session文件,这里和单独删除服务器session结果不一样,是以浏览器为主。

建议,删除服务器的session就可以了,不要用上述方法。

精准删除session

在php中加入一个时间戳,过了就unset(),或者直接session_destroy()删除整个文件。

<?php
session_start();
class Session
{
    public static function setSessions($sessionName, $sessionValue, $lifetime = 600)
    {
         $_SESSION[$sessionName] = [];
         $_SESSION[$sessionName]['value'] = $sessionValue;
         $_SESSION[$sessionName]['lifetime'] = time() + $lifetime;
    }

    public static function getSessions($sessionName){
        if (isset($_SESSION[$sessionName])){
            if ($_SESSION[$sessionName]['lifetime']>time()){
                return $_SESSION[$sessionName]['value'];
            }else{
             unset($_SESSION[$sessionName]);
            }
        }
        return false;
    }
}
<?php
include 'Session.php';

Session::setSessions('name','李四',10);

echo Session::getSessions('name');

sleep(10);

echo Session::getSessions('name');
后记

最后,由于浏览器的PHPSESSID,是追踪网址域名,如果不特别处理,像xampp这种,htdocs放多个文件夹,相当于可以访问多个不同的网站,会共用同一个session文件,所以session[’ ']的名字一定不能重复,或者自己设置session的名字。
在这里插入图片描述
在这里插入图片描述

这样,服务器、浏览器就都有两个session[外链图片转存失败,源站可能有防

在这里插入图片描述

在这里插入图片描述

相互独立使用,虽然域名一致。

具体有哪些可以设置,直接在php.ini里找

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值