二级域名、静态页环境 实现 用户交互(评论,单点登录、注销)的讨论 本帖最后由 zhuyuejianke 于 2012-01-11 00:54:28 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 2。楼主搜索下jquery jsonp 我以前也越到过此问题 就是用它解决的 1. document.domain 问题一:稍微大一点的网站,通常都会有不只一个服务器,每个服务器运行着不同的功能模块或者不同的子系统,他们使用不同的二级域名,比如www.a.com、i.a.com、bbs.a.com。而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站的各个子系统中都是可以登录使用的。各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题,就是用户在i.a.com登录之后,进入www.a.com时,仍然需要重新登录,基本的通行证的问题,映射到技术上,其实就是各个服务器之间如何实现共享 SESSION 数据的问题。为了解决这个问题,我们采用将 SESSION 的数据保存数据库的方式。关于PHP SESSION的扫盲这里就不在累赘。在默认情况下,各个服务器会各自分别对同一个客户端产生 SESSION ID,如对于同一个用户浏览器,www.a.com系统产生的 SESSION ID 是a0211e9de3192ba6c22992d27a1b6a0a,而i.a.com生成的则是277003f262f0c366946a86a28ba431d8。另外,PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。想要共享 SESSION 数据,那就必须实现两个目标:www.a.com和i.a.com所产生的SESSION ID相同,并且可通过同一个 COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的 COOKIE;另一个是 SESSION 数据必须存放在一个各个系统都能访问到的地方。简单地说就是多服务器共享客户端的 SESSION ID,同时还必须共享服务器端的 SESSION 数据。第一个目标的实现其实很简单,只需要对 COOKIE 的域(domain)进行特殊地设置即可,默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各个服务器所设置的 COOKIE 是不能相互访问的,如 www.a.com 的服务器是不能读写 www.b.com 服务器设置的 COOKIE 的。这里我们所说的同一网站的服务器有其特殊性,那就是他们同属于同一个一级域,如:www.a.com 和 i.a.com 都属于域 .a.com,那么我们就可以设置 COOKIE 的域为 .a.com,这样 www.a.com、i.aaa.com 等等都可以访问此 COOKIE。PHP 代码中的设置方法如下:1ini_set('session.cookie_domain', '.a.com');这样各个系统共享同一客户端 SESSION ID 的目的就达到了,下面就是共享SESSION数据,我们就将SESSION数据放在数据库中,首先建立数据库表:1CREATE TABLE sessions (2 session_id varchar(32) NOT NULL,3 session_last_access int(10) unsigned,4 session_data text,5 PRIMARY KEY (session_id)session_id为主键,保存SESSION ID ,session_last_access是SESSION最后更新时间,session_data是SESSION数据。PHP 提供了session_set_save_handle() 函数,可以用此函数自定义 SESSION 的处理过程,当然首先要先将 session.save_handler 改成 user,可在 PHP 中进行设置:接下来着重讲一下 session_set_save_handle() 函数,此函数有六个参数:session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc )各个参数为各项操作的函数名,这些操作依次是:打开、关闭、读取、写入、销毁、垃圾回收。 问题二:静态页面不可避免的失去了交互性能,例如:无法统计信息的阅读次数,无法得到Session信息等等.但也并非没有解决的办法,思路是将整张静态页面分割成若干张小页面,小页面依旧可以是.html静态页面,也可以是.php动态页面.例如,可以嵌套某一零高度零宽度的.php文件专门用作统计信息的阅读次数。若信息量比较大,.html静态页面占用硬盘容量也会随之增大.将静态页面共有的部分组织成一张新的.html页面,再令所有静态页面嵌套这样一个文件有助于降低页面体积.(注意该体积只能降低页面的文件大小,无助于提高访问效率)问题三:在开始讨论 Cookie 的技术细节之前,我想先介绍一下 Cookie 应用的几条限制。大多数浏览器支持最多可达 4096 字节的 Cookie,如果要将为数不多的几个值保存到用户计算机上,这一空间已经足够大,但您不能用一个 Cookie 来保存数据集或其他大量数据。在实际应用中,用户可能并不希望在 Cookie 中保存大量的用户信息,而只希望保存用户编号或其他标识符。之后,当用户再次访问您的站点时,您就可以使用该用户ID 在数据库中查找用户的详细信息。(有关保存用户信息的说明,请参阅 Cookie 和安全性。) 问题四:如果修改PHP的session保存方式?PHP提供了session_set_save_handler用来改变默认的session保存方式 ,查看手册说明如下定义:bool session_set_save_handler ( callback $open, callback $close, callback $read, callback $write, callback $destroy, callback $gc )返回的是bool类型,参数全是一些回调函数,如果你还不知道什么是回调函数,请自己查阅相关的资料弄懂它;当你使用session时,会发生以下session事件:Open : 当你呼叫session_start() 时触发这个事件,在任何使用session前,必须得呼叫此函数;close : 当页面执行完毕时,触发这个事件;read , write当你呼叫session_start()后,先会激活read事件,随后,在页面结束前,会激活write事件,以便将session信息保存到媒介中;destroy : 执行unset($_SESSION[‘key’]) 时,将激活此事件 zy205817 说的我都懂,但是可能我问的问题没问清楚,没法解决我实际的问题,能加QQ聊吗?我给你发消息 只需设置 session.cookie_domain就可以使 session 生效于同一域的各个子域如果多个子域处于不同的服务器中,那么就需要将 session 数据记录于数据库中如何将 session 存储于数据库中,请认真阅读 session_set_save_handler 函数的说明和示例 您说的这种情况我了解了。我补充一种情况就是静态页,如何实现ajax登录退出。因为ajax调用的php不能使用session和cookie是吗? 静态页面是不可以的。除非你用模板进行一个替换,来显示session和cookies保存的值。 php如何访问共享文件夹资源? php操作mysql数据问题求助 麻烦大家帮我看看这几句代码错在哪里,提示Parse error: syntax error, unexpected $end HTTP_X_FORWARDED_HOST的问题 寻找一款外国的虚拟主机,支持PHP+MYSQL,欧洲的最好。 一个根据类别统计的列表,想了很久都没头绪!请高手指点!!! 字符串转换成数组 高手来看:从数据库中提取源代码数据并显示的问题 php+iis+mssql的配置问题?? session变量的跨目录问题 SQL查询写成一个函数 求教nginx 配置网站的一个问题
2。楼主搜索下jquery jsonp 我以前也越到过此问题 就是用它解决的
稍微大一点的网站,通常都会有不只一个服务器,每个服务器运行着不同的功能模块或者不同的子系统,他们使用不同的二级域名,比如www.a.com、i.a.com、bbs.a.com。而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站的各个子系统中都是可以登录使用的。各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题,就是用户在i.a.com登录之后,进入www.a.com时,仍然需要重新登录,基本的通行证的问题,映射到技术上,其实就是各个服务器之间如何实现共享 SESSION 数据的问题。
为了解决这个问题,我们采用将 SESSION 的数据保存数据库的方式。关于PHP SESSION的扫盲这里就不在累赘。在默认情况下,各个服务器会各自分别对同一个客户端产生 SESSION ID,如对于同一个用户浏览器,www.a.com系统产生的 SESSION ID 是a0211e9de3192ba6c22992d27a1b6a0a,而i.a.com生成的则是277003f262f0c366946a86a28ba431d8。另外,PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。
想要共享 SESSION 数据,那就必须实现两个目标:www.a.com和i.a.com所产生的SESSION ID相同,并且可通过同一个 COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的 COOKIE;另一个是 SESSION 数据必须存放在一个各个系统都能访问到的地方。简单地说就是多服务器共享客户端的 SESSION ID,同时还必须共享服务器端的 SESSION 数据。
第一个目标的实现其实很简单,只需要对 COOKIE 的域(domain)进行特殊地设置即可,默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各个服务器所设置的 COOKIE 是不能相互访问的,如 www.a.com 的服务器是不能读写 www.b.com 服务器设置的 COOKIE 的。这里我们所说的同一网站的服务器有其特殊性,那就是他们同属于同一个一级域,如:www.a.com 和 i.a.com 都属于域 .a.com,那么我们就可以设置 COOKIE 的域为 .a.com,这样 www.a.com、i.aaa.com 等等都可以访问此 COOKIE。PHP 代码中的设置方法如下:
1
ini_set('session.cookie_domain', '.a.com');
这样各个系统共享同一客户端 SESSION ID 的目的就达到了,下面就是共享SESSION数据,我们就将SESSION数据放在数据库中,首先建立数据库表:
1
CREATE TABLE sessions (
2
session_id varchar(32) NOT NULL,
3
session_last_access int(10) unsigned,
4
session_data text,
5
PRIMARY KEY (session_id)
session_id为主键,保存SESSION ID ,session_last_access是SESSION最后更新时间,session_data是SESSION数据。
PHP 提供了session_set_save_handle() 函数,可以用此函数自定义 SESSION 的处理过程,当然首先要先将 session.save_handler 改成 user,可在 PHP 中进行设置:
接下来着重讲一下 session_set_save_handle() 函数,此函数有六个参数:
session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc )
各个参数为各项操作的函数名,这些操作依次是:打开、关闭、读取、写入、销毁、垃圾回收。
静态页面不可避免的失去了交互性能,例如:无法统计信息的阅读次数,无法得到Session信息等等.但也并非没有解决的办法,思路是将整张静态页面分割成若干张小页面,小页面依旧可以是.html静态页面,也可以是.php动态页面.例如,可以嵌套某一零高度零宽度的.php文件专门用作统计信息的阅读次数。若信息量比较大,.html静态页面占用硬盘容量也会随之增大.将静态页面共有的部分组织成一张新的.html页面,再令所有静态页面嵌套这样一个文件有助于降低页面体积.(注意该体积只能降低页面的文件大小,无助于提高访问效率)
问题三:
在开始讨论 Cookie 的技术细节之前,我想先介绍一下 Cookie 应用的几条限制。大多数浏览器支持最多可达 4096 字节的 Cookie,如果要将为数不多的几个值保存到用户计算机上,这一空间已经足够大,但您不能用一个 Cookie 来保存数据集或其他大量数据。在实际应用中,用户可能并不希望在 Cookie 中保存大量的用户信息,而只希望保存用户编号或其他标识符。之后,当用户再次访问您的站点时,您就可以使用该用户ID 在数据库中查找用户的详细信息。(有关保存用户信息的说明,请参阅 Cookie 和安全性。)
如果修改PHP的session保存方式?PHP提供了session_set_save_handler用来改变默认的session保存方式 ,查看手册说明如下定义:
bool session_set_save_handler ( callback $open, callback $close, callback $read, callback $write, callback $destroy, callback $gc )
返回的是bool类型,参数全是一些回调函数,如果你还不知道什么是回调函数,请自己查阅相关的资料弄懂它;当你使用session时,会发生以下session事件:Open : 当你呼叫session_start() 时触发这个事件,在任何使用session前,必须得呼叫此函数;
close : 当页面执行完毕时,触发这个事件;
read , write当你呼叫session_start()后,先会激活read事件,随后,在页面结束前,会激活write事件,以便将session信息保存到媒介中;
destroy : 执行unset($_SESSION[‘key’]) 时,将激活此事件
就可以使 session 生效于同一域的各个子域如果多个子域处于不同的服务器中,那么就需要将 session 数据记录于数据库中如何将 session 存储于数据库中,请认真阅读 session_set_save_handler 函数的说明和示例
您说的这种情况我了解了。我补充一种情况就是静态页,如何实现ajax登录退出。因为ajax调用的php不能使用session和cookie是吗?