一、简介
1、什么是session?
答:一种会话控制技术
session 是存放在服务器端来存放用户数据;
作用:实现网页之间数据传递,是一个存储在服务器端的对象集合。
机制:session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息
2、为什么需要会话控制技术?
1)早期互联网采用HTTP协议发送请求,但由于HTTP是无状态的请求,所以网站管理者无法获知当前用户的用户轨迹。
2)Session技术
相当于超市发卡但是保留实体卡,只发给我们卡号(Session_ID)
3、session原理图
二、session跨域场景
使用场景一:
由上图可知,session操作主要是对session的增删改查(session文件的读取与写入)操作,但是由于文件读写操作要实现对服务器的I/O进行开销,如淘宝这种大数据系统,如果采用文本方式保存session数据,那么是无法想象的,另如想统计当前在线人数等信息,使用数据集群共享session数据时,都是很难实现的。
使用场景二:
负载均衡,各不同服务器共享session
使用场景三:
做单点登陆时,或者多个域名共享相同的session
三、解决方案
1、问题:
1)让客户端访问同一个sessionId
2)让所有域名对应的服务器访问的Session的数据的位置必须一致
2、解决方式:
1)nfs文件共享系统,让不同项目访问同一个共享的文件。
2)存放在mysql。
3)存放在内存数据库,比如redis,memcache等。
4)基于cookie的共享。这个需要域名统一。
3、跨域场景
1、同服务器,不同域名,但是主域名相同。(session文件的位置相同,session_id不同)
假设主域名为www.kevinjia.com
在域名kimen.kevinjia.com下创建目录文件test/test.php
test.php中写入以下内容:
在主域名下创建目录文件test/index.php
index.php中写入以下内容:
先访问子域名下的文件,然后访问主域名下的文件,会获得相同的值
2、同服务器,不同的域名(session保存的位置一致,但是session_id没法相同)
www.php.com/20170926/index.php
在当前index.php文件中写入以下内容:
www.str.com/20170926/login.php
在当前login.php文件中写入以下内容:
由于当前接收callback的参数值,只能获取一次,不建议在此页面处理数据,建议在此页面
www.str.com/20170926/index.php
在当前index.php文件中写入以下内容:
3、不同服务器,不同域名(session保存的位置不一样,sessionID也不一致)
4、负载均衡(同一个域名,不同的服务器):session_id一致,session信息存储的位置不一致
四、session入memcache/redis
前提:当前PHP脚本能够操作redis/memcache
1)要在php.ini文件里面设置session文件的存储位置,
memcache,更改存储方式为memcache
或者
更改存储方式为redis
files(默认的),用户自己定义的 memcache|redis
memcahe
2)在php.ini文件中要设置session文件的存储路径,
可以使用逗号分割,指定多台memcache服务器。比如:
session.save_path=”tcp://192.168.10.1:11211,tcp://192.168.10.2:11210”
权限修改,php.ini文件里面的配置,则可以使用ini_set();该函数在页面中进行配置。该配置值针对当前页面有效。
memcache中的是产生的session_id
redis
·
redis设有密码
五、session入库的实现
Session入库技术实际就是人为更改session数据读取与写入的位置,如下图所示:
1、要使用到的知识点:
bool session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc )
session读取存取方式的函数
打开session读写操作
关闭session读写操作
读取session文件(读取数据库中的session信息)
写入session文件(写入session信息到数据库中)
销毁session文件(删除session信息)
当session文件过期时,系统自动删除该文件(删除过期session记录)
入库类
session表)
建立数据表:
)在open方法中,链接数据库
)在close方法中,关闭链接资源
)在read方法中,读取sessid信息,在read方法中,可以通过参数来调用系统中的session_id
)在write方法中,实现对session数据库的写入操作
)在destroy方法中,销毁指定sessin_id的数据
)在gc方法中,判断session数据是否过期
定义构造方法完成调用
效果演示