一、简介

1、什么是session?

答:一种会话控制技术

session 是存放在服务器端来存放用户数据;

作用:实现网页之间数据传递,是一个存储在服务器端的对象集合。

机制:session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息

2、为什么需要会话控制技术?

1)早期互联网采用HTTP协议发送请求,但由于HTTP是无状态的请求,所以网站管理者无法获知当前用户的用户轨迹。

2)Session技术

相当于超市发卡但是保留实体卡,只发给我们卡号(Session_ID)

3、session原理图

  

网关session共享 session共享原理_网关session共享

二、session跨域场景

使用场景一:

由上图可知,session操作主要是对session的增删改查(session文件的读取与写入)操作,但是由于文件读写操作要实现对服务器的I/O进行开销,如淘宝这种大数据系统,如果采用文本方式保存session数据,那么是无法想象的,另如想统计当前在线人数等信息,使用数据集群共享session数据时,都是很难实现的。

使用场景二:

负载均衡,各不同服务器共享session

网关session共享 session共享原理_redis_02

 

使用场景三:

做单点登陆时,或者多个域名共享相同的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中写入以下内容:

网关session共享 session共享原理_服务器_03

在主域名下创建目录文件test/index.php

index.php中写入以下内容:

网关session共享 session共享原理_服务器_04

先访问子域名下的文件,然后访问主域名下的文件,会获得相同的值

2、同服务器,不同的域名(session保存的位置一致,但是session_id没法相同)

www.php.com/20170926/index.php

在当前index.php文件中写入以下内容:

网关session共享 session共享原理_php_05

  

www.str.com/20170926/login.php

在当前login.php文件中写入以下内容:

由于当前接收callback的参数值,只能获取一次,不建议在此页面处理数据,建议在此页面

    

网关session共享 session共享原理_服务器_06

    

  www.str.com/20170926/index.php

  在当前index.php文件中写入以下内容:

      

网关session共享 session共享原理_网关session共享_07

    

3、不同服务器,不同域名(session保存的位置不一样,sessionID也不一致)

  

网关session共享 session共享原理_redis_08

  

网关session共享 session共享原理_服务器_09

  

4、负载均衡(同一个域名,不同的服务器):session_id一致,session信息存储的位置不一致

        

网关session共享 session共享原理_服务器_10

        

网关session共享 session共享原理_php_11

        

网关session共享 session共享原理_服务器_12

  

四、session入memcache/redis

前提:当前PHP脚本能够操作redis/memcache

1)要在php.ini文件里面设置session文件的存储位置,

memcache,更改存储方式为memcache

        或者

更改存储方式为redis

    

网关session共享 session共享原理_php_13

files(默认的),用户自己定义的  memcache|redis

    memcahe

2)在php.ini文件中要设置session文件的存储路径,

    

网关session共享 session共享原理_网关session共享_14

 

可以使用逗号分割,指定多台memcache服务器。比如:

    session.save_path=”tcp://192.168.10.1:11211,tcp://192.168.10.2:11210”

权限修改,php.ini文件里面的配置,则可以使用ini_set();该函数在页面中进行配置。该配置值针对当前页面有效。

memcache中的是产生的session_id  

 redis  

    

网关session共享 session共享原理_redis_15

    ·  

网关session共享 session共享原理_网关session共享_16

redis设有密码

    

网关session共享 session共享原理_php_17

      

网关session共享 session共享原理_redis_18

    

网关session共享 session共享原理_redis_19

五、session入库的实现

Session入库技术实际就是人为更改session数据读取与写入的位置,如下图所示:

    

网关session共享 session共享原理_网关session共享_20

 

    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表)

      建立数据表:

      

网关session共享 session共享原理_redis_21

)在open方法中,链接数据库

      

网关session共享 session共享原理_网关session共享_22

)在close方法中,关闭链接资源

      

网关session共享 session共享原理_redis_23

)在read方法中,读取sessid信息,在read方法中,可以通过参数来调用系统中的session_id

      

网关session共享 session共享原理_服务器_24

)在write方法中,实现对session数据库的写入操作

      

网关session共享 session共享原理_redis_25

)在destroy方法中,销毁指定sessin_id的数据

     

网关session共享 session共享原理_网关session共享_26

      

)在gc方法中,判断session数据是否过期

      

网关session共享 session共享原理_网关session共享_27

定义构造方法完成调用

      

网关session共享 session共享原理_php_28

    效果演示

        

网关session共享 session共享原理_网关session共享_29