博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP-SESSION深入理解
阅读量:5275 次
发布时间:2019-06-14

本文共 2260 字,大约阅读时间需要 7 分钟。

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

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

  后来写了个程序, 如下:

1 

  三种情况:

    火狐打开一个窗口两个标签, 依次访问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

你可能感兴趣的文章
《转载》POI导出excel日期格式
查看>>
code异常处理
查看>>
git - 搭建最简单的git server
查看>>
.net中从GridView中导出数据到excel(详细)
查看>>
[LeetCode]Single Number II
查看>>
poj3216 Prime Path(BFS)
查看>>
使用IntelliJ IDEA 2016创建maven管理的Java Web项目
查看>>
R语言 线性回归
查看>>
Ubuntu下用cue文件对ape和wav文件自动分轨
查看>>
会话控制
查看>>
推荐一款UI设计软件Balsamiq Mockups
查看>>
DRF的版本控制,认证,权限和频率限制
查看>>
Linux crontab 命令格式与详细例子
查看>>
百度地图Api进阶教程-地图鼠标左右键操作实例和鼠标样式6.html
查看>>
游标使用
查看>>
LLBL Gen Pro 设计器使用指南
查看>>
SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP
查看>>
Android 设置界面的圆角选项
查看>>
百度地图api服务端根据经纬度得到地址
查看>>
sqlserver计算时间差DATEDIFF 函数
查看>>