SESSION
SESSION基本使用
session原理
session与浏览器无关,但是与cookie有关.
1. php碰到session_start()时开启session会话,会自动检测sessionID;
1.1如果cookie中存在sessionID,则使用现成的;
1.2如果cookie中不存在sessionID,创建一个sessionID,并通过响应头以cookie形式保存到浏览器上
2. 初始化超全局变量$_SESSION为1个空数组
3. php通过sessionID去指定位置(session文件存储位置)匹配对应的文件
3.1不存在该文件:创建一个sessionID命名文件;
3.2存在该文件: 读取文件内容(反序列化),将数据存储到$_SESSION中
4. 脚本执行结束,将$_SESSION中保存的所有数据序列化存储到sessionID对应的文件中
启用session,需要开启session(脚本使用到$_SESSION就开启1次)
$_SESSION是通过session_start()函数调用时才会定义的:
如上,直接使用$_SESSION会发现其未定义.
session使用需要先调用session_start()
设置session信息
- 如果想存储数据到session中,那么只要不断给$_SESSION数组添加元素即可.
读取session信息
- 读取$_SESSION数组即可获取session信息
会话技术的本质是为了实现跨脚本共享数据:在一个脚本中定义数据,在其他脚本中可读取数据.
我们新开1个脚本文件读取上一个脚本的session:
此时我们按浏览器F12"开发者选项"查看:
删除1个session信息:
删除session就是将session数据清理掉(让$_SESSION拿不到)
删除指定session: unset($_SESSION['某元素下标']);
删除所有session信息
删除所有session信息就是让$_SESSION变成空数组
session相关配置(php.ini)
session基础配置
- 1. session.name : session名字,保存到cookie中sessionID对应的名字
- 2. session.auto_start : 是否自动开启session(无须使用session_start()函数开启).默认为关闭
- 3. session.save_handler :session数据默认的保存方式,默认是文件形式
- 4. session.save_path: session文件默认存储的位置.默认没有开启,说明借用操作系统的临时文件存储.
使用系统的文件夹存储并不安全,我们需要指定一个存储文件夹.用户可根据实际需要自行指定一个存储文件夹.
session常用配置
- 1. session.cookie_lifetime:php sessionID对应的cookie生命周期.默认生命周期0指至会话结束(浏览器关闭)
- 2. session.cookie_path sessionID在浏览器存储之后允许服务器访问的路径(cookie作用范围),默认是全站
- 3. session.cookie_domain: sessionID对应的cookie允许访问的子域范围(是否可以跨子域).默认只能当前主机访问,禁止跨子域.
配置的两种形式
- 1. php.ini中配置:修改php.ini
- 2. 脚本中配置:php可以通过ini_set()函数来在运行中设定某些配置项(只会对当前运行的脚本有效).把这种配置称之为项目级.
ini_set:ini_set()函数: 为一个配置选项设置值.设置指定配置选项的值。这个选项会在脚本运行时保持新的值,并在脚本结束时恢复。
格式:ini_set ( string $varname
, string $newvalue
) : string
参数: varname 指定配置项.(注意:
不是所有有效的选项都能够用 ini_set() 来改变的。 这里有个有效选项的清单附录); newvalue 设置配置
选项新值。
返回值:成功时返回旧的值,失败时返回 FALSE
。
例如在脚本中设置一个选项:
销毁session
session删除只是删除session数据,$_SESSION看不到而已.销毁session是指真正物理删除session对应的session文件.
session_destroy()函数:根据session_start()得到的sessionID去寻找对应的session文件并删除.
session垃圾回收机制
session垃圾回收机制原理
垃圾回收参数设置:
1. session.gc.maxlifetime = 1440 : 规定session文件最大生命周期是1440秒
2. session.gc.probability = 1 : 垃圾回收概率因子(分子)
probability 英[ˌprɒbəˈbɪləti]美[ˌprɑːbəˈbɪləti] n.可能性; 或然性; 很可能发生的事; 概率; 几率; 或然率;
3. sesson.gc.divisor = 1000 : 垃圾回收概率分母
禁用COOKIE后使用session
禁用cookie后不能使用session的原因
session技术需要利用cookie来保存sessionID. 从而使得php可以跨脚本时得到相同sessionID,从而访问同一个session文件.
示例:我们关闭浏览器cookie看看效果,如下:
我们在脚本1中设置session,如下:
我们在脚本2中读取session,如下:
运行脚本1,服务器产生session文件,如下:
运行脚本2,服务器产生新session文件,并没有读取其他脚本产生的原session文件,如下:
解决思路:最终让session_start开启之前拿到先前脚本产生的原来的sessionID(而不是再产生1个新sessionID).
实现无cookie使用session
方案A:利用php提供的函数:session_id和session_name来获取/设置sessionID和name.从而解决session_start总是产生新sessionID的情况.(手动操作)
- 1.在session保存数据的脚本中获取sessionID和名字:
- 2. 想办法将数据传递给其他脚本:表单传值(url或者form表单)
- 3. 在其他(接收session的)脚本中接受数据.为了阻止session_start产生新的sessionID.需要使用session_id函数设置读取到的id
方案B: 利用session机制中已经提供的解决方案自动操作(配置)
原因1:默认session配置只允许使用cookie保存sessionID
原因2:默认关闭了其他能够传送数据的方式,只保留了cookie:
- 1. 修改php.ini配置文件,开启其他方式传输sessionID.关闭[ 只允许使用cookie传输功能 ].
需要更改为:session.use_only_cookies = 0
需要更改为: session.use_trans_sid = 1
- 2. 一旦配置开启,php会自动将sessionID和session名字在其他位置绑定数据.同时还会在session_start的时候,考虑其他方式(表单)传递数据,而不是只有cookie.
如上,效果和方案A一样,只是免于手工保存/获取sessionID和名字.(由PHP系统自动完成)
总结:网站实际开发禁止使用[禁用cookie时使用session].不建议修改以上PHP.INI配置.