zoukankan      html  css  js  c++  java
  • php实现多域名共享session会话

    php会话机制参考:我的随笔

    缘起

    网站,通常会有多个服务器,多个子域名,每个节点运行着不同模块。有时为了整体体验,用户用同一个用户名、密码浏览整站,不用重复登录。这时候就需要多服务器共享session_id和session数据,即生成的session_id是一样的,且能共同访问相同的session数据。

    session简单原理

    浏览器客户端登录网站时,PHP使用 session_start() 打开 SESSION,这样就会产生客户端的SESSION ID(此 ID 可通过函数 session_id() 获取/设置)。服务器返回set_cookie,浏览器将session_id保存进入cookie。默认COOKIE 的名为 PHPSESSID,可在php.ini设置。
    默认情况下,php.ini 中设置的 SESSION 保存方式是 files(session.save_handler = files),目录由 session.save_path 指定,文件名以 sess_ SESSION ID,如:sess_c72665af28xxooffggggb51b。如果访问量大, SESSION 文件多的话,可以设置分级目录保存:session.save_path="N;/save_path",N 为分级的级数,save_path 为开始目录。

    多服务器共享

    了解 SESSION 的工作原理,发现,默认各个服务器会对同一个客户端产生 不同的SESSION ID,如同一个用户浏览器,A 服务器产生的是 30fhrde1e9de31tggne2992dddb6h0a,而 B 服务器生成的则是 c23fghjkloip014c0fergggggg000w8e1b。

    要达到共享,就需要生成的会话id一致,并且会话数据能被所有服务器访问到。

    默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各个服务器所设置的 COOKIE 是不能相互访问的。可以设置 COOKIE 的域为 .xxoo.com,这样 a.xxoo.com、b.xxoo.com 等等都可以产生并访问相同的COOKIE,在通过cookie获取会话信息了。PHP 代码中的设置方法如下

     

    <?php ini_set('session.cookie_domain', '.xxoo.com'); ?>    

    至于session数据的存放,因为在多服务器下需要都能访问,所以可以存在数据库,redis/memcache等大家都能读取到的地方。

    默认情况下 SESSION 数据是以文件方式保存,想要使用其他方式保存,就必须重新自定义 SESSION 各个操作的处理函数。PHP 提供了session_set_save_handle() 函数,可以用此函数自定义 SESSION 的处理方式。

             //不使用 GET/POST 变量方式传递
             ini_set('session.use_trans_sid',    0);  
             //设置垃圾回收时间  
             ini_set('session.gc_maxlifetime',   3600);  
             //使用 COOKIE 保存 SESSION ID 的方式  
             ini_set('session.use_cookies',      1);  
            ini_set('session.cookie_path',      '/');  
             //设置多域名 
             ini_set('session.cookie_domain',    '.xxoo.com');  
             //将 session.save_handler 设置为 user自定义,而不是默认的 files  
             session_module_name('user');  
             //定义 SESSION操作所对应的方法名:  
             session_set_save_handler(  
                  array('OP_class', 'open'),   //对应于静态方法 My_Sess::open(),下同。  
                 array('OP_class', 'close'),  
                  array('OP_class', 'read'),  
                  array('OP_class', 'write'),  
                  array('OP_class', 'destroy'),  
                  array('OP_class', 'gc')  
              );  

    关键函数:session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc )  参考文档说明。

  • 相关阅读:
    RK 清理后台所有历史App任务
    RK onConfigurationChanged ConfigChanges 设备状态的改变
    RK audio 拨号同时输出Speaker和USB音频
    RK 微信视频通话预览倒立
    Unity 笔记
    C# 泛型约束为枚举
    Unity Editor 扩展PropertyDrawer (属性的 Inspector )
    Unity Editor 笔记
    Unity 反转法线,在 Hierarchy 视图对象的快捷菜单中增加 Flip Mesh Normals(反转网格法线)项
    Blender 2.9 骨骼
  • 原文地址:https://www.cnblogs.com/thingk/p/9115567.html
Copyright © 2011-2022 走看看