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 )  参考文档说明。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值