🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 什么是session - session 被称为会话,主要是保持某个访问者的数据 - 客户端访问服务器,通过session_id获取自己存储在服务器端的数据 - session_id通过两种方式传递给服务端:URL,cookie ### session开启 - php.ini文件 session.auto\_start设置为1,则自动开启session或手动开启 调用session_start()函数 - 开启后,先初始化$_SESSION。(通过客户端传递过来的session_id,读取相应的session文件里面的内容,在将反序列化之后,赋值给$_SESSION超全局数组。第一次访问若没有session_id,则$_SESSION为空数组) - session_start()这个阶段还会判断哪些session文件已经过期,然后再触发垃圾回收机制进行回收 - session_start()之后,脚本运行周期内,php只是对$_SESSION这个超全局数据进行操作,并没有影响session文件,除非执行了session_destroy()操作。 - 脚本执行结束阶段,才会对session文件进行操作,也就是把$_SESSION数组中的数据序列化然后存储到session文件中 - 在会话开启后,对于基于文件的会话数据存储器而言,在会话开始的时候会给数据文件加锁,直到php脚本执行完毕,或者显示的调用session_write_close()来保存会话数据,在此期间,其他脚本不可以访问同一个会话数据文件 ### session配置 - session.cookie_lifetime 已秒数指定发送到浏览器的cookie的什么周期,值为0表示‘ 直到关闭浏览器 - session.save_handler = redis session的存储器,默认是 file - session.save_path = "tcp://127.0.0.1:6379" session的存储路径 - session.gc_probability = 1; 清楚无效session的基率 - session.gc_divisor = 5000; 启动垃圾回收程序的概率。概率计算公式:session.gc_probability / session.gc_divisor - session.gc_maxlifetime session文件过期时间。超过这个时间没有使用session将视为垃圾。将在下次垃圾回收时删除。 ### 自定义的session存储 - 先修改配置文件 `ini_set('session.save_handler', 'use')` - 自定义session存储层 ``` 参数1:表示session_strat的时候处理的函数 参数2:表示脚本结束的时候处理的函数 参数3:读取session数据表中的数据函数 参数4:向session数据表中写入数据函数 参数5:销毁session数据表中的数据函数 参数6:session过期之后的处理函数 session_set_save_handler($open,$close,$read,$write,$destroy,$gc); //回调函数 function open{ //初始化连接数据库 } function close{ return true; } //读取session数据表中的数据 //系统会自动把客户携带过来的session_id传递给read里面 function read($session_id){ //执行查询操作 //return 返回查询的结果 } //在session数据表中写入数据 //当$_SESSION['name']='zhangsan';的操作时,就会把数据写入到session表中 function write($session_id,$session_content){ //执行插入操作 } //当执行session_destroy的操作是,会执行destroy函数 //销毁session,系统自动会把sessionid传递给函数 function destroy($sessionid){ //执行删除操作 //return 返回删除的结果 } //当session_start()的时候判断哪些session过期了,会自动把session数据的有效期传递过来。 function gc($max_lifetime){ $time = time-$max_lifetime; 然后和数据库中的最后一次访问的时间作比较,要是过期了就执行删除操作 } ```