很多时候一个完整的系统可能运行在多个服务器上,如果这多个服务器之间需要共享session的话,那么php默认的files保存session的方式就无能为力了。这时我们可以考虑使用memcache 来接管session的保存与读取工作。
第一步:我们需要在服务器上搭建必要的环境
php 、web server的安装不是主题就不多说了,其他还需要的是 memcached 服务端、php_memcache扩展
以centos 为例(注:以下安装命令跟服务器配置有关,不能保证通用性,请根据实际情况进行调整)
安装 memcached
$ yum install memcached
安装php_memcache扩展
$ yum install php-pecl-memcache
或者
$ pecl install memcache
注:扩展安装完毕后需要重启web server来使用扩展生效
第二步:启动memcached服务进程
$ /usr/bin/memcached -p 12321 -m 384M -u nobody -d
第三步:检查php扩展是否正确安装
1、命令行执行php -m 查询结果中是否有memcache项
2、创建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共享还有其他很多方式,
如:
1、tokyo tyrant ,这个和memcache原理相同
2、session保存在数据库中(需要自己定时清理数据库中过期的session)
3、通过NFS文件共享的方式,多台WEB服务器共享保存session文件的磁盘 http://imysql.cn/?q=node/202