PHP + Memcache 实现多服务器session共享

不少时候一个完整的系统可能运行在多个服务器上,若是这多个服务器之间须要共享session的话,那么php默认的files保存session的方式就无能为力了。这时咱们能够考虑使用memcache 来接管session的保存与读取工做。 php

第一步:咱们须要在服务器上搭建必要的环境,node

php 、web server的安装不是主题就很少说了,其余还须要的是 memcached 服务端、php_memcache扩展mysql

下面安装为centos 下的示例(注:如下安装命令跟服务器配置有关,不能保证通用性,请根据实际状况进行调整)web

安装 memcached sql

$ yum install memcached
 

安装php_memcache扩展数据库

$ yum install php-pecl-memcache
 

或者centos

$ pecl install memcache
 

注:扩展安装完毕后须要重启web server来使用扩展生效浏览器

第二步:启动memcached服务进程服务器

 $ /usr/bin/memcached -p 12321 -m 384M -u nobody -d
 

第三步:检查php扩展是否正确安装cookie

一、命令行执行php -m 查询结果中是否有memcache项

二、建立phpinfo()页面,查询session项下面的Registered save handlers值中是否有memcache项

四步:在两台服务器上进行测试

测试代码示例:

<?php
ini_set('session.save_handler', 'memcache');
ini_set('session.cookie_domain','.sample.com');
ini_set('session.save_path','tcp://10.22.229.141:12321?persistent=1&weight=1&timeout=1&retry_interval=15');
session_start();
if (!isset($_SESSION['session_time'])) {  
 $_SESSION['session_time'] = time();
}
echo "session_time:".$_SESSION['session_time']."<br />";
echo "now_time:".time()."<br />";
echo "session_id:".session_id()."<br />";
?>
 

保存上面代码(注意替换域名和IP),分别放在两台服务器的web目录下,打开两个浏览器标签,前后访问两个地址,若是两个页面输出的session_time后的时间戳和session_id是同样的话就说明已经OK了。

第五步:修改现有代码,切换php的session.save_handler

在全部须要共享session的入口文件中都增长如下代码(须要加在session_start()函数以前)

ini_set('session.save_handler', 'memcache');
ini_set('session.cookie_domain','.sample.com');
ini_set('session.save_path','tcp://10.22.229.141:12321?persistent=1&weight=1&timeout=1&retry_interval=15');
 
 

或者也能够直接到php.ini中修改上面三行的相应的取值,这样就不须要改动已有的PHP代码,根据实际状况选择方案。

第一行是指定session的保存方式

第二行是指定session_id生成的cookie域,也就是你想要共享session的cookie域,注意替换成本身的域名

第三行是session的保存路径,这里是使用tcp去链接memcached端口,注意替换成本身的提供memcache服务的服务器IP

OK,大功告成了。

注:因为memcache协议是不须要权限验证的,任何人均可以访问memcache中存储的数据,因此须要设置好防火墙规则,禁止未受权IP访问,或者在启动memcached进程时使用 -l 参数指定只监听局域网IP。

固然,要实现多机session共享还有其余不少方式,

如:

一、tokyo tyrant ,这个和memcache原理相同

二、session保存在数据库中(须要本身定时清理数据库中过时的session)

三、经过NFS文件共享的方式,多台WEB服务器共享保存session文件的磁盘 http://imysql.cn/?q=node/202

相关文章
相关标签/搜索