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

字体大小: 中小 标准 ->行高大小: 标准
很多时候一个完整的系统可能运行在多个服务器上,如果这多个服务器之间需要共享session的话,那么php默认的files保存session的方式就无能为力了。这时我们可以考虑使用memcache 来接管session的保存与读取工作。 
第一步:我们需要在服务器上搭建必要的环境

php 、web server的安装不是主题就不多说了,其他还需要的是 memcached 服务端、php_memcache扩展

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

安装 memcached 

[plain] view plaincopyprint?
1.$ yum install memcached 
 $ yum install memcached安装php_memcache扩展

[plain] view plaincopyprint?
1.$ yum install php-pecl-memcache 
$ yum install php-pecl-memcache或者

[plain] view plaincopyprint?
1.$ pecl install memcache 
$ pecl install memcache注:扩展安装完毕后需要重启web server来使用扩展生效

第二步:启动memcached服务进程

[plain] view plaincopyprint?
1.$ /usr/bin/memcached -p 12321 -m 384M -u nobody -d 
$ /usr/bin/memcached -p 12321 -m 384M -u nobody -d第三步:检查php扩展是否正确安装

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

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

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

测试代码示例:

[php] view plaincopyprint?
1.<?php 
2.ini_set('session.save_handler', 'memcache'); 
3.ini_set('session.cookie_domain','.sample.com'); 
4.ini_set('session.save_path','tcp://10.22.229.141:12321?persistent=1&weight=1&timeout=1&retry_interval=15'); 
5.6.session_start(); 
7.if (!isset($ _SESSION['session_time'])) {
8.$ _SESSION['session_time'] = time();
9.}
10.echo "session_time:".$ _SESSION['session_time']."<br />";
11.echo "now_time:".time()."<br />";
12.echo "session_id:".session_id()."<br />";
13.?>
<?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的话,那么php默认的files保存session的方式就无能为力了。这时我们可以考虑使用memcache 来接管session的保存与读取工作。
第一步:我们需要在服务器上搭建必要的环境
php 、web server的安装不是主题就不多说了,其他还需要的是 memcached 服务端、php_memcache扩展
以centos 为例(注:以下安装命令跟服务器配置有关,不能保证通用性,请根据实际情况进行调整)
安装 memcached
[plain] view plaincopyprint?
$ yum install memcached
$ yum install memcached
安装php_memcache扩展
[plain] view plaincopyprint?
$ yum install php-pecl-memcache
$ yum install php-pecl-memcache
或者
[plain] view plaincopyprint?
$ pecl install memcache
$ pecl install memcache
注:扩展安装完毕后需要重启web server来使用扩展生效
第二步:启动memcached服务进程
[plain] view plaincopyprint?
$ /usr/bin/memcached -p 12321 -m 384M -u nobody -d
$ /usr/bin/memcached -p 12321 -m 384M -u nobody -d
第三步:检查php扩展是否正确安装
1、命令行执行php -m 查询结果中是否有memcache项
2、创建phpinfo()页面,查询session项下面的Registered save handlers值中是否有memcache项
第四步:在两台服务器上进行测试
测试代码示例:
[php] view plaincopyprint?
<?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()函数之前)
[php] view plaincopyprint?
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');
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
SESSION['session_time'])) {
很多时候一个完整的系统可能运行在多个服务器上,如果这多个服务器之间需要共享session的话,那么php默认的files保存session的方式就无能为力了。这时我们可以考虑使用memcache 来接管session的保存与读取工作。
第一步:我们需要在服务器上搭建必要的环境
php 、web server的安装不是主题就不多说了,其他还需要的是 memcached 服务端、php_memcache扩展
以centos 为例(注:以下安装命令跟服务器配置有关,不能保证通用性,请根据实际情况进行调整)
安装 memcached
[plain] view plaincopyprint?
$ yum install memcached
$ yum install memcached
安装php_memcache扩展
[plain] view plaincopyprint?
$ yum install php-pecl-memcache
$ yum install php-pecl-memcache
或者
[plain] view plaincopyprint?
$ pecl install memcache
$ pecl install memcache
注:扩展安装完毕后需要重启web server来使用扩展生效
第二步:启动memcached服务进程
[plain] view plaincopyprint?
$ /usr/bin/memcached -p 12321 -m 384M -u nobody -d
$ /usr/bin/memcached -p 12321 -m 384M -u nobody -d
第三步:检查php扩展是否正确安装
1、命令行执行php -m 查询结果中是否有memcache项
2、创建phpinfo()页面,查询session项下面的Registered save handlers值中是否有memcache项
第四步:在两台服务器上进行测试
测试代码示例:
[php] view plaincopyprint?
<?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 />";
?>
___FCKpd___4
保存上面代码(注意替换域名和IP),分别放在两台服务器的web目录下,打开两个浏览器标签,先后访问两个地址,如果两个页面输出的session_time后的时间戳和session_id是一样的话就说明已经OK了。
第五步:修改现有代码,切换php的session.save_handler
在所有需要共享session的入口文件中都增加以下代码(需要加在session_start()函数之前)
[php] view plaincopyprint?
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');
___FCKpd___5
或者也可以直接到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
SESSION['session_time'] = time();
}
echo "session_time:".很多时候一个完整的系统可能运行在多个服务器上,如果这多个服务器之间需要共享session的话,那么php默认的files保存session的方式就无能为力了。这时我们可以考虑使用memcache 来接管session的保存与读取工作。
第一步:我们需要在服务器上搭建必要的环境
php 、web server的安装不是主题就不多说了,其他还需要的是 memcached 服务端、php_memcache扩展
以centos 为例(注:以下安装命令跟服务器配置有关,不能保证通用性,请根据实际情况进行调整)
安装 memcached
[plain] view plaincopyprint?
$ yum install memcached
$ yum install memcached
安装php_memcache扩展
[plain] view plaincopyprint?
$ yum install php-pecl-memcache
$ yum install php-pecl-memcache
或者
[plain] view plaincopyprint?
$ pecl install memcache
$ pecl install memcache
注:扩展安装完毕后需要重启web server来使用扩展生效
第二步:启动memcached服务进程
[plain] view plaincopyprint?
$ /usr/bin/memcached -p 12321 -m 384M -u nobody -d
$ /usr/bin/memcached -p 12321 -m 384M -u nobody -d
第三步:检查php扩展是否正确安装
1、命令行执行php -m 查询结果中是否有memcache项
2、创建phpinfo()页面,查询session项下面的Registered save handlers值中是否有memcache项
第四步:在两台服务器上进行测试
测试代码示例:
[php] view plaincopyprint?
<?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 />";
?>
___FCKpd___4
保存上面代码(注意替换域名和IP),分别放在两台服务器的web目录下,打开两个浏览器标签,先后访问两个地址,如果两个页面输出的session_time后的时间戳和session_id是一样的话就说明已经OK了。
第五步:修改现有代码,切换php的session.save_handler
在所有需要共享session的入口文件中都增加以下代码(需要加在session_start()函数之前)
[php] view plaincopyprint?
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');
___FCKpd___5
或者也可以直接到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
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()函数之前)
[php] view plaincopyprint?
1.ini_set('session.save_handler', 'memcache');
2.ini_set('session.cookie_domain','.sample.com');
3.ini_set('session.save_path','tcp://10.22.229.141:12321?persistent=1&weight=1&timeout=1&retry_interval=15');
___FCKpd___5
或者也可以直接到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

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/67546.html