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. Golang 实现 set 集合,变相实现 切片去重、排序 功能

    Java 中的集合(set)去重很方便,PHP 中的数组值去重,就更加方便,一个函数搞定:array_unique(),Golang 中就比较苦逼了,官方没有提供对“切片去重”的功能,而项目中,又经常 ...

  2. 【BZOJ3036】绿豆蛙的归宿 概率DP

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

  3. error LNK1104:无法打开文件"lua51.lib"

    今天学习C++与Lua通信,遇到了问题:fatal error LNK1104: 无法打开文件“lua51.lib” 开发环境: VS2012 cocos版本:cocos2d-x-3.0 已经按书&l ...

  4. windows php7 安装 mongodb 扩展

    1. 打开phpinfo 查看 nts(非线程) 还是 ts (线程),然后查看操作位数 注: 86 等于 32 位 2. 下载对应的版本的php_mongodb.dll 文件下载链接: pecl m ...

  5. sprintf将CString转换成char[]

      在MFC中使用sprintf()函数将CString转换成char[]时,char[]只接受第一个字符 使用的是VS2008 CString name;dbName="test" ...

  6. RescuePro Deluxe恢复软件SanDisk

      RescuePro Deluxe恢复软件 注册码:RPDLX-0600-67844-04261-27951 买硬盘送的,没有用.   文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论

  7. 基于CentOS体验万象优图鉴黄服务

    系统要求:CentOS 7.2 64 位操作系统 初始化配置 使用万象优图图片鉴黄 API 接口,我们需要先完成以下步骤: 获取腾讯云账号 APP ID 配置云 API 公钥/密钥 配置优图 buck ...

  8. EF+LINQ事物处理

    在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作同一条数据的同一个字段的话, ...

  9. easyui-switchbutton js判断是否启动

    <input class="easyui-switchbutton" id="statusId" name="status" onTe ...

  10. MySQL 5.6新特性 -- Multi-Range Read

    如果基表很大,数据没有被缓存,在二级索引上使用范围扫描读取行可能会导致大量的随机磁盘访问.使用Multi-Range Read新特性,mysql可以减少对磁盘的随机读的次数:首先,mysql只是扫描索 ...