SESSION基本使用
SESSION原理
Session与浏览器无关,但是与Cookie有关。
1、PHP碰到session_start()时开启session会话,会自动检测sessionID
a)如果Cookie中存在,使用现成的
b)如果Cookie中不存在,创建一个sessionID,并通过响应头以Cookie形式保存到浏览器上
2、初始化超全局变量 S E S S I O N 为 一 个 空 数 组 3 、 P H P 通 过 s e s s i o n I D 去 指 定 位 置 ( s e s s i o n 文 件 存 储 位 置 ) 匹 配 对 应 的 文 件 a ) 不 存 在 该 文 件 : 创 建 一 个 s e s s i o n I D 命 名 文 件 b ) 存 在 该 文 件 : 读 取 文 件 内 容 ( 反 序 列 化 ) , 将 数 据 存 储 到 _SESSION为一个空数组 3、PHP通过sessionID去指定位置(session文件存储位置)匹配对应的文件 a)不存在该文件:创建一个sessionID命名文件 b)存在该文件:读取文件内容(反序列化),将数据存储到 SESSION为一个空数组3、PHP通过sessionID去指定位置(session文件存储位置)匹配对应的文件a)不存在该文件:创建一个sessionID命名文件b)存在该文件:读取文件内容(反序列化),将数据存储到_SESSION中
4、脚本执行结束,将$_SESSION中保存的所有数据序列化存储到sessionID对应的文件中
SESSION基本使用
启用session,任何时候都需要开启session(脚本使用到$_SESSION就开启一次)
$_SESSION是通过session_start()函数的调用才会定义的,没有直接定义
Session使用需要开启session_start
设置SESSION信息
如果想存储数据到session中,那么只要不断给$_SESSION数组添加元素即可
读取SESSION信息
$_SESSION就是一个数组,存储什么数据,什么方式存的,就是可以通过什么方式访问什么数据
会话技术的本质是为了实现跨脚本共享数据:在一个脚本中定义数据,在另外一个脚本中保存数据
SESSION基本使用
删除session就是将session数据清理掉( S E S S I O N 拿 不 到 ) 删 除 一 个 S E S S I O N 信 息 U n s e t ( _SESSION拿不到) 删除一个SESSION信息 Unset( SESSION拿不到)删除一个SESSION信息Unset(_SESSION[元素下标])删除指定session数据
删除全部SESSION信息
删除全部数据就是让$_SESSION变成一个空数组
SESSION基本使用
SESSION相关配置
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:PHPsessionID在浏览器端对应COOKIE的生命周期,默认是会话结束
2)session.cookie_path:sessionID在浏览器存储之后允许服务器访问的路径(COOKIE有作用范围)
3)session.cookie_domain:COOKIE允许访问的子域(COOKIE可以跨子域)
配置的两种形式
1)php.ini中配置:全局配置,修改php.ini中的配置项
2)脚本中配置:PHP可以通过ini_set函数来在运行中设定某些配置项(只会对当前运行的脚本有效),把这种配置称之为项目级
@Ini_set(‘session.save_path’,’E:/server/sessions’);
SESSION基本使用
Session删除是指删除session数据,$_SESSION中看不到而已;销毁session是指删除session对应的session文件。
销毁SESSION
系统提供一个函数:session_destroy(),会自动根据session_start得到的sessionID去找到指定的session文件,并把其删除。
SESSION基本使用
SESSION垃圾回收机制
垃圾回收机制原理
session会话技术后,session文件并不会自动清除,如果每天有大量session文件产生但是又都是失效的,会增加服务器的压力和影响session效率。
垃圾回收,是指session机制提供了一种解决垃圾session文件的方式:给session文件指定周期,通过session文件最后更改时间与生命周期进行结合判定,如果已经过期则删除对应的session文件,如果没有过期则保留。这样就可以及时清理无效的僵尸文件,从而提升空间利用率和session工作效率。
1、任何一次session开启(session_start),session都会尝试去读取session文件
2、读取session文件后,有可能触发垃圾回收机制(在session系统中也是一个函数:自己有一定几率调用)
3、垃圾回收机制会自动读取所有session文件的最后编辑时间,然后加上生命周期(配置文件)与当前时间进行比较(所有session文件)
a)过期:删除
b)有效:保留
垃圾回收参数设置
1)session.gc_maxlifetime = 1440:规定的session文件最大的生命周期是1440秒,24分钟
2)session.gc_probability = 1:垃圾回收概率因子(分子)
3)session.gc_divisor = 1000:垃圾回收概率分母
默认的触发概率是1/1000
测试垃圾回收效果:
1、 修改生命周期为2分钟,120秒
2、 修改触发几率:100%
SESSION基本使用
禁用COOKIE后如何使用SESSION
禁用COOKIE不能使用SESSION原因
Session技术需要利用到COOKIE技术来保存sessionID,从而使得PHP能够在跨脚本的时候得到相同的sessionID,从而访问同一个session文件。
解决思路:最终让session_start在开启之前拿到原来的sessionID(另外一个脚本的)
实现无COOKIE使用SESSION
在PHP中,想要解决没有COOKIE也实现session技术的方式有两种:
方案1:可以利用PHP提供的session函数:session_id和session_name来获得和设置sessionID或者name从而解决session_start产生新sessionID的情况(手动操作):
1、 在session保存数据的脚本中获取sessionID和名字
2、 想办法将数据传递给另外一个脚本:表单传值(URL或者form表单)
3、 在需要使用到session的脚本中,先接收数据
4、 组织session_start产生新的ID,告诉它已经存在:session_id($id)
方案2:可以利用session集中已经提供的解决方案自动操作(配置)
原因1:默认session配置只允许使用COOKIE保存sessionID:cookie_ony
原因2:默认关闭了其他能够传送数据的方式,只保留了COOKIE
1、 修改PHP配置文件,开启其他方式传输sessionID,关闭只允许使用COOKIE传输功能
2、 一旦配置开启,PHP会自动将sessionID和session名字在其他位置绑定数据,同时还会在session_start的时候,考虑其他方式传递(表单)的数据,而不是只有COOKIE