一、简介
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中写入以下内容:
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926233202419-921814188.png)
在主域名下创建目录文件test/index.php
index.php中写入以下内容:
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926233233919-552546436.png)
先访问子域名下的文件,然后访问主域名下的文件,会获得相同的值
2、同服务器,不同的域名(session保存的位置一致,但是session_id没法相同)
在当前index.php文件中写入以下内容:
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926233447778-1838766189.png)
在当前login.php文件中写入以下内容:
由于当前接收callback的参数值,只能获取一次,不建议在此页面处理数据,建议在此页面
在当前index.php文件中写入以下内容:
3、不同服务器,不同域名(session保存的位置不一样,sessionID也不一致)
4、负载均衡(同一个域名,不同的服务器):session_id一致,session信息存储的位置不一致
四、session入memcache/redis
前提:当前PHP脚本能够操作redis/memcache
1)要在php.ini文件里面设置session文件的存储位置,
session.save_handler=memcache,更改存储方式为memcache
或者
session.save_handle=redis, 更改存储方式为redis
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926233932731-2120322773.png)
存储位置的设置可以为:files(默认的),用户自己定义的 memcache|redis
memcahe
(2)在php.ini文件中要设置session文件的存储路径,
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926233945247-650234184.jpg)
session.save_path=”tcp://localhost:11211”,可以使用逗号分割,指定多台memcache服务器。比如:
session.save_path=”tcp://192.168.10.1:11211,tcp://192.168.10.2:11210”
如果自己没有 权限修改,php.ini文件里面的配置,则可以使用ini_set();该函数在页面中进行配置。该配置值针对当前页面有效。
实际上存在memcache中的是产生的session_id
redis
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234114544-1484779772.jpg)
· ![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234133840-506878131.jpg)
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234133840-506878131.jpg)
假设redis设有密码
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234201559-491386644.jpg)
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234223528-1455350074.jpg)
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234237653-700397764.jpg)
五、session入库的实现
Session入库技术实际就是人为更改session数据读取与写入的位置,如下图所示:
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234305403-1237182824.jpg)
1、要使用到的知识点:
bool session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc )
功能:实现对session读取存取方式的函数
$open : 打开session读写操作
$close : 关闭session读写操作
$read : 读取session文件(读取数据库中的session信息)
$write : 写入session文件(写入session信息到数据库中)
$destroy : 销毁session文件(删除session信息)
$gc : 当session文件过期时,系统自动删除该文件(删除过期session记录)
2、session入库类
前提:不同的服务器共用一套数据库系统(session表)
建立数据表:
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234409278-1311537312.jpg)
a)在open方法中,链接数据库
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234505778-590200397.jpg)
b)在close方法中,关闭链接资源
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234533934-93519475.jpg)
c)在read方法中,读取sessid信息,在read方法中,可以通过参数来调用系统中的session_id
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234605762-771919725.jpg)
d)在write方法中,实现对session数据库的写入操作
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234638512-930741936.jpg)
e)在destroy方法中,销毁指定sessin_id的数据
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234710919-60812454.jpg)
f)在gc方法中,判断session数据是否过期
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234754497-1693156726.jpg)
g)定义构造方法完成调用
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234819231-1657829049.jpg)
效果演示
![](https://images2017.cnblogs.com/blog/1212896/201709/1212896-20170926234842122-1597423289.jpg)
独乐乐不如众乐乐,资源共享