一些php中session的理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32080545/article/details/78802090

写在最前面:
感谢这位博主的分享::诗小蓝–《彻底理解PHP的SESSION机制》

你知道这几个问题吗?
1. session会话是怎么控制多个用户的?(或者这样问:session是存储在服务器上的文件,怎么保证用户信息不冲突?)
2. 为什么浏览器关闭了再打开session就不起作用了?

php中session的历程…….

引用自php手册:

session_start() 会创建新会话或者重用现有会话。 如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID, 则会重用现有会话。
当会话自动开始或者通过 session_start() 手动开始的时候, PHP 内部会调用会话管理器的 open 和 read 回调函数。 会话管理器可能是 PHP 默认的, 也可能是扩展提供的(SQLite 或者 Memcached 扩展), 也可能是通过 session_set_save_handler() 设定的用户自定义会话管理器。 通过 read 回调函数返回的现有会话数据(使用特殊的序列化格式存储), PHP 会自动反序列化数据并且填充 $_SESSION 超级全局变量。

手册中说到的一个词语是“会话ID”,通过这个“会话ID”就可以解释问题1了;无论是重用还是创建会话ID,session都会往客户端存放一个会话ID(以cookie的方式存储),这样就能区别不同的客户端了,就能保证用户信息不冲突了:
示例:

<?php
session_start();
if(!isset($_SESSION['login'])){
    echo '没有登录';
    $_SESSION['login'] = [
      'id'=>2,
      'name'=>'newUser',
      'age'=>'22'
    ];
}else{
    var_dump($_SESSION['login']);
}

当第一次访问的时候以上代码时我们来看看整个请求过程:
第一次访问

从代码顺序来看,session_start(),php SESSION 产生了一个名字叫做“PHPSESSID”的会话ID,产生后进入if,往这次会话里面添加数据$_SESSION[‘login’],此时的响应头,已经给客户端设置了会话ID了,注意红色方框里面设置的会话ID值,此时是“n1vl465rpj0hi35177jiap2ud2”;
第二次访问:
第二次访问
第二次访问就是重用现有会话了,可以看到请求头已经将刚刚存储的会话ID请求过去了,会话ID就是刚刚创建的:‘n1vl465rpj0hi35177jiap2ud2’;

结论:

回答问题1:每一次会话都会产生唯一的会话ID,这个会话ID会对应不同的session文件,因此session存储的用户信息是不会冲突的
那么为什么关闭浏览器session就失效了呢?
回答问题2:SESSION发出去的COOKIE一般属于即时COOKIE(手册是这样描述的:session.cookie_lifetime 以秒数指定了发送到浏览器的 cookie 的生命周期。值为 0 表示“直到关闭浏览器”。默认为 0。),当浏览器关闭后,COOKIE就过期了,重新进入时又只能重新设置PHPSESSID了

猜你喜欢

转载自blog.csdn.net/qq_32080545/article/details/78802090