1.浏览器窗口与SESSION间的关系

  记得去年的时候网上抢手机(你懂的), 特意开两个窗口, 哪个进度快用哪个.如此到输入验证码的时候老是出错, 结果----没抢到~

  后来写了个程序, 如下:

1 <?php
2     session_start();
3     if (!isset($_SESSION['time'])) {
4         $_SESSION['time'] = microtime(true);
5     }
6     echo $_SESSION['time'];

  三种情况:

    火狐打开一个窗口两个标签, 依次访问http://localhost/test/session.php, 返回结果相等, IE同是

    火狐打开两个窗口, 依次访问http://localhost/test/session.php, 返回结果相等, IE同是

    火狐打开一个窗口,  IE打开一个窗口依次访问http://localhost/test/session.php, 返回结果不等

  结论:

    一个浏览器不论多少窗口, 共用一个SESSIONID.输入验证码错误的原因就是打开第一个页面拿着SESSIONID去服务器刷出一个CODE存到SESSION里, 第二个页面同时也拿着同一个SESSIONID去服务器刷, 此时服务器存储的CODE为第二次刷的.回到第一个窗口输入显示的验证码, 肯定错误了.

    session在客户端是根据浏览器类型(IE, 火狐, Chrome等)存储SESSIONID,  不是根据窗口或者选项卡. 浏览器拿着此SESSIONID去服务器获取存储的数据.

2.SESSION函数

  session_start(): 开启SESSION

  session_name(): 获取SESSION键值对的键(默认为PHPSESSID, 可以查看COOKIE)

  session_id(): 获取SESSION键值对的值(服务器根据一定算法得出来的唯一值, 比如md5(客户端IP . 当前秒数 . 随机数))

3.SESSION流程

  客户端访问服务器, 服务器产生一个唯一SESSIONID, 通过HTTP响应头Set-Cookie:PHPSESSID(PHP.INI中session.name, 及session_name()一样的值)=SESSIONID(同session_id()一样的值), 把SESSIONID存储到浏览器, 浏览器再次访问服务器的时候HTTP请求头会带上PHPSESSID=SID, 如果用户禁用了COOKIE, 可以通过URL附带session_name()=session_id(), 服务器获取到SESSIONID后即可通过$_SESSION获取SESSION的值.

4.SESSION误解

  关掉浏览器SESSION就消失的原因是错误的, 因为服务器根本无法知道用户是否关闭了浏览器, 服务器只能靠SESSION时间过期来删除(具体删除原理继续往下看). 倘若原来的SESSIONID未过期, 那么修改HTTP请求头, 拿着此SESSIONID依旧可以获得存储的值.

5.SESSION的配置

  平时用到的SESSION配置有:

    session.save_handler=file //指定服务器端存储SESSION的方式, 默认为文件存储

    session.save_path="C:/Users/oo/AppData/Local/Temp" //如果SESSION的存储方式是以文件存储的, 这项配置是指定存储到哪个路径下

    session.use_cookies=1 //是否用COOKIE来存储SESSIONID, 若为0, 可以用URL传值的方式

    session.name=PHPSESSID //默认的SESSION存储时键名

    session.auto_start=0 //是否自动开启SESSION, 若为1, 则使用SESSION前不用session_start()

    session.cookie_lifetime=0 //存储到客户端COOKIE时间, 0表示关闭浏览器此COOKIE就消失

    session.cookie_path=/ //哪个目录访问时带上此COOKIE

    session.cookie_domain= //指定域

    session.serialize_handler=php //用什么对存储的数据进行序列化

    session.gc_probability=1 //此两条看文章下文的回收机制

    session.gc_divisor=100

    session.gc_maxlifetime=1440 //设置SESSION的生存期限

6.session回收机制

  由于PHP为单线程, 也就不能创建DAEMON自动去清除过时的SESSION, 只能靠用户访问来自动触发, 或者Linux自定义任务. 靠用户访问触发的原理为用户每次请求时, 在1和session.gc_divisor之间rand一个值, 如果此值<=session.gc_probability, 则服务器去清除过时的SESSION文件(把handler交给数据库的话服务器就不会管了), 这样就实现了session.gc_probability / session.gc_divisor概率去删除SESSION文件, 大体就这么个原理吧. 具体暂不知道.

7.session保存到数据库

转载于:https://www.cnblogs.com/JohnABC/p/3246068.html

PHP-SESSION深入理解相关推荐

  1. [html] 说说你对cookie和session的理解

    [html] 说说你对cookie和session的理解 cookie: 可以通过客户端, 服务端设置, 容量小, 可以通过设置domain来实现同步登录, 除了name, value, 它还有多个选 ...

  2. Spark session 深入理解

    Spark session Spark session 深入理解 创建SparkSession Builder 的方法如下: 设置参数 读取元数据 读取数据 使用SparkSQL 存储/读取Hive表 ...

  3. 对cookie与session的理解

    cookie: 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户. cookie的出现就是为了解决这个问题, 第一次登录 ...

  4. Java Web之Cookie和Session的理解

    日常现象 登录了某个网站,过一会儿再登录,诶,不用输入密码了,直接是登录状态了,好神奇~~~ 在某网站看了一部手机,接下来浏览其他网站,旁边的广告全是手机和类似信息,好恐怖~~~ 浏览某网站时,提示我 ...

  5. Session的理解

    一.Session简介 Session的使用场景 当我们登陆电商网站时,无论浏览哪个页面都会显示登陆人的名字,还可以随时查看购物车里面的商品 也就是说当一个用户浏览一个网站的不同页面时,服务器怎么知道 ...

  6. cookie和session的理解

    一个常见的错误是以为 session 在有客户端访问时就被创建,然而事实是直到某 server 端程序(如 Servlet )调用HttpServletRequest.getSession(true) ...

  7. hibernate中SessionFactory,Session的理解?

    Session接口         Session接口对于Hibernate   开发人员来说是一个最重要的接口.然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会 ...

  8. 对session的理解

    java Servlet API引入session 机制来跟踪客户的状态,session指的是在一段时间内,单个客户和web服务器之间一连串的交互过程,在一个session中,一个客户可能会多次请求同 ...

  9. 说说对javaee中的session的理解

    在服务器上,通过Session来区分每一个上网用户 用户只要一连接到服务器,则立刻分配一个Session给用户 Session主要方法: 1 服务器上通过Session来分别不同的用户-->Se ...

  10. cookie 百科_Cookie和session应该这样理解

    前言 虽然在学习服务器端语言的时候屡屡提到了Cookie和session这两个概念,有关Cookie和Session的接口也调用过,但始终对实现交互机制和这两者区别的理解感觉是云里雾里,于是打算静下心 ...

最新文章

  1. It's Time to Say Goodbye (此刻告别)
  2. 5位华人学生开发出了机器导盲犬!四足机器人技能又+1
  3. excel大作业素材_Excel | 同一单元格内多个姓名,如何统计人数
  4. c#winform演练 ktv项目 播放歌曲同时显示歌曲名称与歌手
  5. 升级到Oracle 19c:你不可不知的十大SQL问题(上)
  6. 无迹卡尔曼滤波器(UKF)
  7. ghost系统卡正在启动服务器,GHOST完后安装win7系统卡在正在启动windows界面...-华硕笔记本装win7,华硕win10改win7步骤...
  8. rman异机恢复 Linux _RAC至Win_Single Instance note
  9. 【TiDB@丰巢】支付平台的迁移之旅
  10. LaTeX 相对于 Word 有什么优势?
  11. 基础知识之————直方图
  12. 前端 查看页面在不同分辨率下效果
  13. echarts柱状图的样式调整及应用
  14. HBase是个啥子?
  15. 电视剧《猎毒人》观后感
  16. 一分耕耘一分收获,精诚所至金石为开
  17. 查看使用linkedIn Camus 把Kafka中的数据导入HDFS中生成的.deflate文件
  18. ToString数据如何反序列化
  19. 支持javascript的ppt软件_Reveal.js是在浏览器中播放创建在线PPT幻灯片的开源库包...
  20. 《怪诞行为学2-非理性的积极力量》读书笔记

热门文章

  1. spring-mybatis.xml 访问html5,Spring mvc无xml配置及利用JdbcTemplate访问数据库
  2. python合并ts视频_python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频
  3. python把字符串放到列表_python中for循环把字符串或者字典添加到列表的方法
  4. eslint 配置_前端代码规范配置 (一)
  5. matlab选择结构
  6. BZOJ-2705-Longge的游戏-SDOI2012-欧拉函数
  7. 前n个正整数相乘的时间复杂度为_初一数学必学必考的21个知识点,附第一章有理数测试卷...
  8. 【HDU 1269】迷宫城堡 (Tarjan算法)
  9. jQ复制按钮的插件zclip
  10. T-SQL管理数据库对象