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

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

  后来写了个程序, 如下:

 <?php
session_start();
if (!isset($_SESSION['time'])) {
$_SESSION['time'] = microtime(true);
}
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保存到数据库

PHP-SESSION深入理解的更多相关文章

  1. ECshop中的session机制理解

    ECshop中的session机制理解     在网上找了发现都是来之一人之手,也没有用自己的话去解释,这里我就抛砖引玉,发表一下自己的意见,还希望能得到各界人士的指导批评! 此session机制不需 ...

  2. php中session的理解

    一.Session是什么 Session一般译作会话,牛津词典对其的解释是进行某活动连续的一段时间.从不同的层面看待session,它有着类似但不完全同样的含义.比方,在web应用的用户看来,他打开浏 ...

  3. php session的理解【转】

    目录 1.什么是session? 2.Session常见函数及用法? ● 如何删除session? ● SESSION安全: Session跨页传递问题: 1.什么是session?   Sessio ...

  4. php session的理解与使用

    session学习参考链接:1.http://www.w3cschool.cn/php_sessions.html:2.http://php.net/manual/zh/book.session.ph ...

  5. JAVA EE中session的理解

    转自[互动百科]http://www.baike.com/wiki/Session   Session Session:在计算机中,尤其是在网络应用中,称为“会话”.Session直接翻译成中文比较困 ...

  6. cookie&&session再理解笔记

    就拿php来说,两个php页面之间不拿get,post传递变量的话,数据是不能共享的.访问完1.php页面该页面的变量就被销毁了.所以就拿学校食堂来说,拿现金买饭的话你交完钱后,他给你个票以便确认你, ...

  7. 对JSP中的Session 简单理解

    我的理解: 简单来说,要使用服务器端的session对象,就是要有其对应的key,即sessionid,它只认识sessionid. 下面我说的cookie,url重写或者隐藏表单,都是为了将其对应的 ...

  8. 对session的理解

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

  9. session配置理解

    session.cache_limiter 指定会话页面所使用的缓冲控制方法,默认为nocache.session.cache_expire 以分钟数指定缓冲的会话页面的存活期,默认为180.此设定对 ...

  10. Session深入理解

    Session是在什么情况下产生的 客户端访问服务器端,服务器端为每个用户生成一个唯一的sessionId,是这样吗?sessionId的作用是什么? http://www.cnblogs.com/s ...

随机推荐

  1. .net 系列:Expression表达式树、lambda、匿名委托 的使用【转】

    https://www.cnblogs.com/nicholashjh/p/7928205.html 首先定义一个泛型委托类型,如下: public delegate T Function<T& ...

  2. Windows server 2008 SSD性能测试

    过渡到windows 7.windows8是趋势,老迈的windows xp .windows server 2003已经快到淘汰的阶段,安装了windows server 2008 R2 ,测试了下 ...

  3. MongoDB分页的Java实现和分页需求的思考

    前言 传统关系数据库中都提供了基于row number的分页功能,切换MongoDB后,想要实现分页,则需要修改一下思路. 传统分页思路 假设一页大小为10条.则 //page 1 1-10 //pa ...

  4. 强化Linux安全的10个技能

    1.找出不必要的服务 很明显,服务器上跑的服务,并不是每个都有用的.强烈建议检查并关掉不需要的服务,从而减少风险(多跑一个服务,就可能多几个漏洞). 查询运行在runlevel 3的服务列表: [af ...

  5. IncrediBuild 2.40 过期时间

    IncrediBuild 2.40的License有2个文件CoordLicense.dat和AgentLicense.dat,分别位于Coordinator和Agent安装目录下,这两个文件都是RS ...

  6. HDU 1541 Stars (线段树)

     Problem Description Astronomers often examine star maps where stars are represented by points on ...

  7. 强大的Mockito测试框架

    转载:https://blog.csdn.net/dc_726/article/details/8568537 1自动生成Mock类   在需要Mock的属性上标记@Mock注解,然后@RunWith ...

  8. pycharm下设置自己的模板

    在File---settings---File and Code Templates---Python script 脚本里添加: #!usr/bin/env python #-*- coding:u ...

  9. UIFont字体大全

    原文地址:UIFont 设置字体作者:青竹居士     http://deep-fish.iteye.com/blog/1678874UIFont 设置字体 1 label.font = [UIFon ...

  10. 微软BI 之SSRS 系列 - 使用 LookupSet 和 Adjacent Group 等高级技巧在报表中跨 Dataset 分组查询

    SSRS 报表中有一些高级的技巧,平常很少用到,下面我通过这个案例来展现一下如何在实际开发中使用它们,并且如何解决一些实际的需求. 这张报表分别统计了不同的 Product 产品在不同的月份的 Ord ...