码迷,mamicode.com
首页 > 其他好文 > 详细

session共享

时间:2017-09-27 00:38:03      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:内容   文件中   构造   管理   权限   png   ora   负载   存储位置   

一、简介
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、解决方式:
1nfs文件共享系统,让不同项目访问同一个共享的文件。
2)存放在mysql
3)存放在内存数据库,比如redismemcache等。
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没法相同)
在当前index.php文件中写入以下内容:
技术分享

  

在当前login.php文件中写入以下内容:
由于当前接收callback的参数值,只能获取一次,不建议在此页面处理数据,建议在此页面

    技术分享

    

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

      技术分享

    

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

  技术分享

  技术分享

  

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

        技术分享

        技术分享

        技术分享

  

四、sessionmemcache/redis
前提:当前PHP脚本能够操作redis/memcache
       1)要在php.ini文件里面设置session文件的存储位置
      session.save_handler=memcache,更改存储方式为memcache
        或者
      session.save_handle=redis, 更改存储方式为redis
    技术分享
      存储位置的设置可以为:files(默认的),用户自己定义的  memcache|redis
    memcahe
  (2)在php.ini文件中要设置session文件的存储路径,
    技术分享
 
    
    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  
    技术分享
    ·  技术分享
      
  假设redis设有密码
    技术分享
      技术分享
    技术分享
    
 五、session入库的实现
Session入库技术实际就是人为更改session数据读取与写入的位置,如下图所示:
    技术分享
 
    
    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表)
      建立数据表:
      技术分享
      a)在open方法中,链接数据库
      技术分享
      
    b)在close方法中,关闭链接资源
      技术分享
     
    c)在read方法中,读取sessid信息,在read方法中,可以通过参数来调用系统中的session_id
      技术分享
     
    d)在write方法中,实现对session数据库的写入操作
      技术分享
     
    e)在destroy方法中,销毁指定sessin_id的数据
      技术分享

      

    f)在gc方法中,判断session数据是否过期
      技术分享
      
    g)定义构造方法完成调用
      技术分享
  
    效果演示
        技术分享

session共享

标签:内容   文件中   构造   管理   权限   png   ora   负载   存储位置   

原文地址:http://www.cnblogs.com/KevinJia/p/7599638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!