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. [Asp.net core]bootstrap分页

    摘要 一直在用前后端分离,在一个后台管理的页面中,尝试封装了一个辅助类. 类 /// <summary> /// 分页viewmodel /// </summary> /// ...

  2. 你真的会用Gson吗?Gson使用指南(4)

    原文出处: 怪盗kidou 注:此系列基于Gson 2.4. 本次文章的主要内容: TypeAdapter JsonSerializer与JsonDeserializer TypeAdapterFac ...

  3. leetcode344 反转字符串 c++实现

    编写一个函数,其作用是将输入的字符串反转过来. 示例 1: 输入: "hello" 输出: "olleh" 示例 2: 输入: "A man, a p ...

  4. 4、搭建Python环境

    搭建Python环境 Linux环境 大多Linux发行版均默认安装了Pthon环境.如想下载不同的版本,可到www.python.org下载.软件安装方法参照Linux软件安装. 输入Python可 ...

  5. 微信小程序无法获取UnionId的情况及处理

    问题背景:做了微信小程序,一切都还正常,但是最后体验版放出去时,却发现很多用户无法绑定用户,后台返回:参数非法.经过多方排查,发现是微信拿到的code请求返回的数据里没有UnionId,也就是接口返回 ...

  6. (转)GrabPass捕捉屏幕纹理

    转自:http://blog.sina.com.cn/s/blog_89d90b7c0102va4m.html 最近在看热扭曲效果,里面用到了GrabPass. 之前看过官方翻译版本的说明http:/ ...

  7. Linux下在root权限下临时使用其它用户运行命令

    一.简述 当我们在使用Linux时,经常需要在root权限下执行某些命令,或者在/etc/rc.d/rc.local中写一些角本.而如果某些角本必须使用非root用户时,直接su是不行的,比如Elas ...

  8. TinyMCE与Domino集成

    TinyMCE与Domino集成 一:TinyMCE简介 TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成.它对IE6+和Firefox1.5+都有着非常良好的支持 ...

  9. DataTables 全局设置中文语言

    参考来源:https://blog.csdn.net/qq_22690445/article/details/79682311 $.fn.dataTable.defaults.oLanguage = ...

  10. sql in not in 案例用 exists not exists 代替

    from AppStoke B WHERE B.Opencode=A.Code) in用extist代替 select distinct * from Stoke where Code not in ...