同一个顶级域名下的session共享方案

平时开发的小网站一般使用单个域名放到单个服务器上就可以了,那么,如果在同一个网站下使用多个子域名的时候,问题就来了,session不允许跨域,也就是说在a.test.com中设置的session到
b.test.com中不不存在了,怎么办?解决方法是让同一个主域名下的session可以共享,用以下3种方式:
1、在程序入口文件且在session_start()之前,设置:
ini_set(‘session.cookie_domain’, ‘.test.com’);
ini_set(‘session.cookie_lifetime’, ‘1800’);
2、php.ini中设置:
session.cookie_domain = .test.com;
session.cookie_lifetime = 1800;
3、在程序入口文件且在session_start()之前,设置:
session_set_cookie_params(1800 , ‘/’, ‘.test.com’);
这样在同一台服务器上多个子域名共享session的问题就解决了!

那么,如果子域名放在不同的服务上呢?这个时候我们发现session默认是以文件的形式储存到服务器上的,现在程序都分别放在两台服务器上去了,还怎么共享呢?解决办法是改变session默认的储存
方式。本文以memcache为例(当然也可以使用数据库来存储),将session信息都储存到memcache中,两个应用都到memcache中去存取session信息,同样使用3种方式:
1、php.ini中设置:
session.save_handler = memcache
session.save_path = “tcp://192.168.1.100:11211″
session.cookie_domain = ‘.test.com’
2、某个目录下的 .htaccess
php_value session.save_handler “memcache”
php_value session.save_path “tcp://192.168.1.100:11211″
php_value session.cookie_domain “.test.com”
3、在程序入口文件且在session_start()之前,设置:
ini_set(“session.save_handler”, “memcache”);
ini_set(“session.save_path”, “tcp://192.168.1.100:11211″);
ini_set(‘session.cookie_domain’, ‘.test.com’);

ini_set(“session.save_handler”, “memcached”); // 是memcached不是memcache
ini_set(“session.save_path”, “192.168.1.100:11211″); // 不要tcp

192.168.1.100代表memcache服务器ip地址,根据实际情况换成自己的ip,除了以上的方式还可以自己写一个处理类通过函数session_set_save_handler来处理session的存取问题。

windows php memcached 安装使用步骤

本文以php5.3为例:

1、下载文件包memcache(php5.3.28)

2、解压到:d:\memcached

3、在终端(也即cmd命令界面)下输入 ‘d:\memcached\memcached.exe -d install’ 安装

4、再输入: ‘d:\memcached\memcached.exe -d start’ 启动。(需要注意的: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了)

5、拷贝php_memcache.dll到php的ext文件夹下

6、php.ini 加入一行 ‘extension=php_memcache.dll’

7、接着在 php.ini 文件里加上:

[php][Memcache]<br />
memcache.allow_failover = 1<br />
memcache.max_failover_attempts=20<br />
memcache.chunk_size =8192<br />
memcache.default_port = 11211 [/php]

常用设置:
-p <num>          监听的端口
-l <ip_addr>      连接的IP地址, 默认是本机
-d start          启动memcached服务
-d restart        重起memcached服务
-d stop|shutdown  关闭正在运行的memcached服务
-d install        安装memcached服务
-d uninstall      卸载memcached服务
-u <username>     以<username>的身份运行 (仅在以root运行的时候有效)
-m <num>          最大内存使用,单位MB。默认64MB
-M                内存耗尽时返回错误,而不是删除项
-c <num>          最大同时连接数,默认是1024
-f <factor>       块大小增长因子,默认是1.25
-n <bytes>        最小分配空间,key+value+flags默认是48
-h                显示帮助

在Lamp环境下快速搭建memcache

1、由于CentOS系统默认源没有memcache安装包,因此需要导入第三方的源。执行如下两条命令:

[root@EACNCTCSHHSHH00B001 data]# wget ftp://fr2.rpmfind.net/linux/epel/5/ppc/epel-release-5-4.noarch.rpm

[root@EACNCTCSHHSHH00B001 data]# rpm -ivh epel-release-5-4.noarch.rpm

2、yum安装Memcache服务器与php扩展

[root@EACNCTCSHHSHH00B001 data]# yum install memcached php-pecl-memcache

此时应该能正常安装这两个包,而不出现无法找到的情况。

3、安装成功后,检测php是否正常加载了memcache模块:

[root@EACNCTCSHHSHH00B001 data]# php -m|grep memcache

memcache

返回了“memcache”表示已经安装。

4、设置memcached服务开机自动启动

[root@EACNCTCSHHSHH00B001 data]# chkconfig memcached on

5、启动memcached服务并重启Apache

[root@EACNCTCSHHSHH00B001 data]# /etc/init.d/memcached start

启动 memcached:[确定]

[root@EACNCTCSHHSHH00B001 data]# /etc/init.d/httpd restart

停止 httpd:[确定]

启动 httpd:[确定]

6、测试php支持memcache是否正常

在apache的网站根目录建立 memcache.php 文件

[root@EACNCTCSHHSHH00B001 www]# vi memcache.php

内容如下:

[php]<br />
&lt;?php<br />
$memcache= new Memcache();<br />
$memcache-&gt;connect(‘127.0.0.1′, 11211);<br />
$memcache-&gt;set(‘key’, ‘Memcache test successful!’, 0, 60);<br />
$result= $memcache-&gt;get(‘key’);<br />
unset($memcache);<br />
echo $result;<br />
?&gt;<br />
[/php]

如果一切正常,访问此页面,应该正常返回“Memcache test successful”,至此,Memcached与php扩展memcache安装成功。

Memcached的默认端口为11211,因此在php中使用此端口即可。下面顺便给出个清除memcache所有缓存内容的方法:

执行:

[root@EACNCTCSHHSHH00B001 data]# nc localhost 11211

然后输入:

flush_all

quit