session的存储方式
默认会存储在服务器的临时目录,以文件的形式存储,文件名为(sess_+session_id),这些都可以在php.ini文件中配置,文件内容为序列化的数据,如下:
$_SESSION['name'] = ‘张三' $_SESSION['age'] = 18
session文件为:
name|i:张三;age|i:18
下面是常用的php.ini文件中sessionde相关配置:
session.save_handler = files #规定session的存储方式,默认是文件,还可以是redis或者是memcache,提升效率 session.save_path = "d:/wamp/tmp" #规定session文件的存储目录 session.use_cookies = 1 #是否使用cookie存储session_id session.name = PHPSESSID #客户端存储session_id的会话名 session.auto_start = 0 #是否自动开启session session.cookie_lifetime = 0 #设置客户端中存储的session_id的过期时间,注意session的过期时间是间隔的,比如20分钟过期,重新访问了,session的过期时间会重新计算,cookie的过期时间是累记的 session.serialize_handler = php session.gc_divisor = 1000 session.gc_probability = 1 session.gc_maxlifetime = 1440 #设置session文件的过期时间
session的垃圾回收机制
一个用户访问服务器会产生一个session文件,关闭浏览器,然后在访问服务器又会产生一个新的session文件,这样session的垃圾文件就会很多,长时间不清理就会占用大量的磁盘空间,访问session文件的速度也会降低,gc进程垃圾回收就很有必要了
先提一下PHP的一些清理session的函数
unset($_SESSION['name']) 清理某个变量 session_unset() 不传参数,清除所有的session变量,但是session文件还在 session_destroy() 清除session文件 setcookie(session_name(), '', time()-1000, '/') 设置cookie文件过期
注意:一般做了session_destroy()操作之后,setcookie(session_name(), '', time()-1000, '/')也是必须的,不然用户重新刷新页面,又会设置一样的session_id,产生session文件
然后就是gc自动删除垃圾文件:
session.gc_divisor = 1000 session.gc_probability = 1 session.gc_maxlifetime = 1440 #设置session文件的过期时间
删除session垃圾文件的概率是,session.gc_probability/session.gc_divisor=1/1000,也就是说每次session_start()都会有1/1000的概率触发gc进程,但是1000次中必会有一次,如果session.gc_probalility = 1000,就是100%的概率,也就说每次session_start()都会触发gc进程
微信小程序中的session应用
微信小程序中并没有cookie机制,因此除非你在微信小程序中模拟cookie机制的实现,否则你要专门设置代码用来传送session_id。
wx.request({ url: 'https://your_domain.com/api/function', header: { 'content-type': 'application/json', // 默认值 'session_id': wx.getStorageSync('session_id') // 读取本地缓存中的session_id值 }, success: function(res) { console.log(res.data) } })
后端获取3rd_session的方式也非常简单,只需要读取HTTP Header中的3rd_session字段即可。PHP代码示例如下: