浅析在多服务器下共享Session的解决办法

2014-10-10 17:33龚利
电脑知识与技术 2014年24期
关键词:共享

龚利

摘要:该文分析了在互联网上,同一个网站的模块分布在不同服务器上,如何保证用户登录子站点服务器后,在访问另外一个子站点服务器相关功能时,不需要重新登录即可使用。如何通过共享Session的设置,达到“一次登录,同一网站的不同服务器全部通行”的问题。并且通过PHP程序代码对其进行了实现。

关键词:多服务器;共享;Session

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)24-5597-02

Analysis of Shared Session Solution in Multi Server

GONG Li

(Yunyang Teachers College, Shiyan 442000, China)

Abstract: This paper analyzes the distribution of a site on the Internet module in different server, how to ensure that the user after the login server, into another server related module, do not need to log back in use. This is the problem of how to achieve "once logged in, the same sites of different servers all traffic" by sharing Session Settings. It is achieved by the PHP code.

Key words: multiple servers; shared; Session

1 概述

通常大型网站的服务器会使用几个服务器,通过使用分配二级域名来进行访问不同的服务器,每个服务器运行着不同的功能模块。一个整体比较好的网站中,用户系统应该是标准统一的,即:网站登录的用户名和密码可使用于各种模块。还有一个问题,如何确保用户在服务器上登录后,进入另一个服务器相关的模块,不需要重新登录使用。用通俗的解释就是,“只需要一次登录认证,每个服务器都可以通过”的问题,为了解决这个问题,需要解决同一个网站下的每个服务器如何实现共享会话数据Session。

2 Session运行机制

1) Session产生背景

由于互联网上HTTP本身是一个无状态的连接协议,正因为这种灵活和无连接的特性,当用户连接访问到一个网站时,无法保存和记忆每个用户的身份。为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为用户和网站访问之前交互保存状态,这就是Session技术产生的原因。

2) 什么是Session

Session是从用户访问页面开始,到断开与网站连接为止,从而形成了Session的生命周期。每一次用户连接时,系统会自动生成一个唯一的SessionID以标识当前用户与其他用户区分。在会话期间,PHP默认生成名为PHPSessionID的标识,它随着每一个页面被送往浏览器,然后随下一次页面请求返回给web服务器。

Session通过ID接受每一个访问请求,从而识别当前用户、跟踪和保持用户的具体资料,以及Session变量中存储的数字或文字资料。

3 多服务器下共享Session的解决办法

通过上面对Session的工作原理介绍,我们可以发现,默认情况下,每个服务器向同一客户分别生成一个会话Session ID。如果同一用户的浏览器,访问服务器A的Session ID为Session_A1,而在B服务器上产生的ID是Session_B1,并且PHP的Session数据分别保存在本服务器的文件系统中,如图1所示。

我们发现,Session数据要进行两个服务器共享,所以对于同一浏览器生成session_id必须是相同的,这个session_ID可以通过多个服务器之间发送的Cookie。如果我们给这个用户的session被定义为passid。用于Cookie的域(domain)需要特殊的设置。在这里我们可以使用PHP语句:Ini_set(“session.Cookie_domain”,$domain)。

通常,服务器的域名或IP地址是Cookie的域(domain),如果域是不同的,各服务器Cookie不能互相访问。

假设同一个网站的两台不同服务器分别为:A.yytc.net和B.yytc.net,其一级域名为yytc.net. 则Cookie 的域(domain)可以设置为.yytc.net,PHP语句为:ini_set(“session.Cookie_domain”, “.yytc.net”);

经过设置后,两个服务器可以同时访问cookie,这样即可以达到多个服务器共享同一个客户端的Session ID的目的。

在这里还需要解决另一个问题,是Session的位置和存储方式必须确保每个服务器可以访问,即多服务器共享客户端的Session ID,并且也必须共享服务器的Session数据。相关关键程序代码如下:

先使用SQL语句创建一个数据表,Mysql的语句如下:

CREATE TABLE ‘sessions (

‘p_time bigint(20) NOT NULL default “0”;// p_time变量为Session 过期时间

‘s_data longtext NOT NULL,// s_data变量为用来保存Session 的数据

‘s_id varchar(32) NOT NULL default “ ” ;// s_id变量为 Session ID

PRIMARY KEY (`s_id`);

KEY ‘p_time(‘p_time ‘);

其中初始化函数 function init( )程序关键代码实现如下:

Function init(){ // 初始化init()函数关键php代码

…………

$domain=”.yytc.net”;//session的作用域

Ini_set (“session.gc_maxlifetime”, file_time);//设置session最大生存时间

Ini_set(“session.use_Cookies”,1); //用Cookie保存 SESSION ID 的方式

Ini_set(“session.Cookie_path”,/);// 设置默认的cookie有效路径

Ini_set(“session.Cookie_domain”,”.yytc.net”); //设置多服务器共享保存 SESSION ID 的 Cookie

Session_module_name(“user”); //将session.save_handler 设置为 user

Ini_set (“session.use_trans_sid”, 0); //不传递session_id

…………

} //初始化init()函数结束

4 结束语

本文主要分析了用户在登录同一个网站不同服务器中session共享的解决办法,在实际操作中极大的方便了用户的访问。并且通过PHP程序代码实现了多服务器共享session的实际案例。

参考文献:

[1] 马军.asp网络编程从入门到精通[M].北京:清华大学出版社,2006:200-217.

[2] 田佳淳.php5 mysql5基础与实例教程[M].北京:中国电力出版社,2007:100-150.

猜你喜欢
共享
正确认识五大发展理念的内涵和要求
对应用大数据完善检验监管的思考
从“共享”新闻到“共绘”图景:如何解答新课题
招商引资档案管理与信息资源共享探析
“互联网+教育”视阈下的教育共享初探
谈云计算与信息资源共享管理
褪色的“共享”
挂羊头卖狗肉的“共享”营销
图书馆与出版企业数字资源共享的环境因素分析