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', );
//设置垃圾回收时间
ini_set('session.gc_maxlifetime', );
//使用 COOKIE 保存 SESSION ID 的方式
ini_set('session.use_cookies', );
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 )  参考文档说明。

php实现多域名共享session会话的更多相关文章

  1. TP、PHP同域不同子级域名共享Session、单点登录

    TP.PHP同域不同子级域名共享Session.单点登录 目的: 为了部署同个域名下不同子级域名共享会话,从而实现单点登录的问题,一处登录,同域处处子系统即可以实现自动登录. PHP支持通过设置coo ...

  2. asp.net基于StateServer的二级域名共享session

    备注:亲自试验有效,如果网友有通过下面的教程未实现session共享的,欢迎留言说明你遇到的问题.必有回复. 最近为实现的二级域名共享session纠结好久.网上的很多实现的方法试了都不行,查了很久才 ...

  3. .NET二级域名共享Session

    ASP.NET二级域名站点共享Session状态 今天, 我要写的是如何在二级域名站点之间,主站点和二级域名站点之间共享Session. 首先, Session要共享,站点之间SessionID必须要 ...

  4. 使用 Redis 共享 Session 会话

    储存模式 1.InProc模式 这是ASP.NET默认的Session管理模式,在应用进程内维护Session. 2.StateServer模式 这是在服务器装了.NET环境后自带的一个StateSe ...

  5. PHP实现同服务器多个二级域名共享 SESSion

    现在很多分类信息网站都会分出很多个二级域名出来,比如:sh.ganji.com(上海赶集网), su.ganji.com(苏州赶集网)等等,像这种拥有多个二级域名的网站,该如何实现同步共享sessio ...

  6. Laravel 多域名共享session

    在网站开发中会涉及登陆的问题,在登陆的过程中为了方便用户体验,我们需要用户在主域名登陆,在其他域名下也要保持登陆状态: 在config/session.php中: 更新网站配置缓存即可

  7. Froms 认证 二级域名共享session登录凭证

    1. 需要共享的web.config 里需要加添 <authentication mode="Forms"> <forms name="/> &l ...

  8. 多域名THINKPHP利用MEMCACHE方式共享SESSION数据(转)

    一.问题起源 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名.密码在整个网站的各个模块中都是可以登录使 ...

  9. 跨域共享cookie和跨域共享session

    转载自:http://blog.csdn.net/ahhsxy/article/details/7356128 这里所说的跨域,是指跨二级域名,而且这些域名对应的应用都在同一个app上, 比如我有以下 ...

随机推荐

  1. 工具类TestTools

    一些方法可能要使用到该工具类,该工具类中的方法包括从链接数据库到数据表中记录的增删改查. package JDBCTest; import java.io.InputStream; import ja ...

  2. 继承之final关键字的使用

    final关键字 使用final关键字坐标识具有"最终的"含义, final可以修饰类.方法.属性.和变量. final修饰类表示该类不能被继承 final修饰方法,则表示该方法不 ...

  3. iOS 转换异步block为同步方式运行

    使用dispatch_semaphore_t 实现 dispatch_semaphore_t sema = dispatch_semaphore_create(0); //创建信号量 __block ...

  4. POJ 1595 素数打表水题

    [题意简述]:给出N和C,让我们求出N以内的包含N的素数,然后依据若N以内的素数为奇数个,就将中间2*c-1个素数输出:若为偶数个.就将中间2*c个素数输出. [分析]:仅仅要题意理解就简单了. 详见 ...

  5. org.hibernate.QueryException: JPA-style positional param was not an integral ordinal; nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: JPA-style positional param w

    org.hibernate.QueryException: JPA-style positional param was not an integral ordinal; nested excepti ...

  6. Java HashSet工作原理及实现

    1. 概述 This class implements the Set interface, backed by a hash table (actually a HashMap instance). ...

  7. linux设置预留端口号,防止监听端口被占用 ip_local_reserved_ports

    1. 背景 linux服务器启动时,会对指定的端口进行监听bind,如果同一个机器上这个端口已经被使用,则监听失败,程序无法启动. linux客户端连接服务器accept时,系统会分配本地临时端口用于 ...

  8. SpringBootWEB项目和非Web项目的全局异常捕获

    一.简介 SpringBoot的WEB异常捕获,如果是WEB项目的话,可以直接处理Controller中的异常.如果不是WEB项目的话,就需要使用AspectJ来做切面. 二.WEB项目 packag ...

  9. MongoDB副本集配置系列七:MongoDB oplog详解

    1:oplog简介 oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集合来进行复制的.每个节点都有oplog,记录这从主节点复制过来的信息,这样 ...

  10. Visitor模式和Observer观察者模式

    所谓访问者模式,就是不同服务提供者对同一种服务提供的服务内容不同. Typedef   std::vector<Ivisitable>   VisitbleArray; Typedef  ...