默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各个服务器所
设置的 COOKIE
是不能相互访问的,如 www.aaa.com
的服务器是不能读写 www.bbb.com
服务器设置的 COOKIE 的。
这里我们所说的同一网站的服务器有其特殊性,那就是他们同属于同一个一级域,如:
aaa.infor96.com
和 www.infor96.com
都属于域 .infor96.com
,那么我们就可以设置 COOKIE
的 域 为 .infor96.com
, 这 样 aaa.infor96.com 、 www.infor96.com 等 等 都 可 以 访 问 此
COOKIE。PHP 代码中的设置方法如下:
<?php
ini_set
(
'session.cookie_domain'
,
'.infor96.com'
);
?>
这样各个服务器共享同一客户端 SESSION ID 的目的就达到了。
第二个目标的实现可以使用文件共享方式,如 NFS 方式,但设置、操作上有些复杂。我们
可以参考先前所说的统一用户系统的方式,即使用数据库来保存 SESSION 数据,这样各
个服务器就可以方便地访问同一个数据源,获取相同的 SESSION 数据了。
解决办法如下图所示:
四、代码实现
首先创建数据表,MySQL
的 SQL 语句如下:
CREATE TABLE `sess` (
`sesskey` varchar(32) NOT NULL default '',
`expiry` bigint(20) NOT NULL default '0',
`data` longtext NOT NULL,
PRIMARY KEY (`sesskey`),
KEY `expiry` (`expiry`)
) TYPE=MyISAM
sesskey
为 SESSION ID,expiry
为 SESSION 过期时间,data
用于保存 SESSION 数据。
默认情况下 SESSION 数据是以文件方式保存,想要使用数据库方式保存,就必须重新定
义 SESSION 各个操作的处理函数。PHP 提供了
函数,可以用此
函数自定义 SESSION
的处理过程,当然首先要先将 session.save_handler
改成 user,可在
PHP 中进行设置:
<?php
session_module_name
(
'user'
);
?>
接下来着重讲一下 session_set_save_handle() 函数,此函数有六个参数:
session_set_save_handler ( string open, string close, string read, string write, string destroy, string
gc )
各个参数为各项操作的函数名,这些操作依次是:打开、关闭、读取、写入、销毁、垃圾回收。
PHP
手册中有详细的例子,在这里我们使用 OO 的方式来实现这些操作,详细代码如下: