基于php使用memcache存储session的详解
web服务器的phpsession都给memcached,这样你不管分发器把ip连接分给哪个web服务器都不会有问题了,配置方法很简单,就在php的配置文件内
增加一条语句就可以了,不过前提你需要装好memcache模块
1.设置session用memcache来存储
方法I:在php.ini中全局设置
session.save_handler=memcache
session.save_path="tcp://127.0.0.1:11211"
方法II:某个目录下的.htaccess:
php_valuesession.save_handler"memcache"
php_valuesession.save_path "tcp://127.0.0.1:11211"
方法III:再或者在某个一个应用中:
ini_set("session.save_handler","memcache");
ini_set("session.save_path","tcp://127.0.0.1:11211");
使用多个memcachedserver时用逗号","隔开,并且和Memcache::addServer()文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval"等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2"。
如果安装的PECL是memcached(使用libmemcache库的那个),则配置应为
ini_set("session.save_handler","memcached");//是memcached不是memcache
ini_set("session.save_path","127.0.0.1:11211");//不要tcp:
2.启动memcached:
memcached-d-l127.0.0.1-p11212-m128
或启动Memcache的服务器端:
memcached-d-m100-uroot-l192.168.36.200-p11211-c256-P/tmp/memcached.pid
#/usr/local/bin/memcached-d-m10-uroot-l192.168.0.200-p12000-c256-P/tmp/memcached.pid
引用
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是100MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.36.200,
-p是设置Memcache监听的端口,我这里设置了11211,最好是1024以上的端口,我们这里统一使用11211
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定。
-P是设置保存Memcache的pid文件,我这里是保存在/tmp/memcached.pid,
3.在程序中使用memcache来作session存储
用例子测试一下:
<?php
session_start();
if(!isset($_SESSION["TEST"])){
$_SESSION["TEST"]=time();
}
$_SESSION["TEST3"]=time();
print$_SESSION["TEST"];
print"<br><br>";
print$_SESSION["TEST3"];
print"<br><br>";
printsession_id();
?>
4.用sessionid去memcached里查询一下:
<?php
$memcache=memcache_connect("localhost",11211);
var_dump($memcache->get("19216821213c65cedec65b0883238c278eeb573e077"));
$memcache->set("aaaa","helloeveryone");
var_dump($memcache->get("aaaa"));
?>
会看到
string(37)"TEST|i:1177556731;TEST3|i:1177556881;"
这样的输出,证明session正常工作。
用memcache来存储session在读写速度上会比files时快很多,而且在多个服务器需要共用session时会比较方便,将这些服务器都配置成使用同一组memcached服务器就可以,减少了额外的工作量。缺点是session数据都保存在memory中,持久化方面有所欠缺,但对session数据来说也不是很大的问题。
===================================
一般地,Session是以文本文件形式存储在服务器端的。如果使用Seesion,或者该PHP文件要调用Session变量,那么就必须在调用Session之前启动它,使用session_start()函数。其它都不需要你设置了,PHP自动完成Session文件的创建。其默认Session的存放路径是服务器的系统临时文件夹。
但是如果碰到大数据量的Sesstion的时候,使用基于文件的Session存取瓶颈可能都是在磁盘IO操作上,现在利用Memcached来保存Session数据,直接通过内存的方式,效率自然能够提高不少。在读写速度上会比files时快很多,而且在多个服务器需要共用session时会比较方便,将这些服务器都配置成使用同一组memcached服务器就可以,减少了额外的工作量。
其缺点是session数据都保存在memory中,一旦宕机,数据将会丢失。但对session数据来说并不是严重的问题。
如何用memcached来存储session呢?以下是基本的配置步骤:
1.安装memcached
在phpinfo输出中的“Registeredsavehandlers”会有“filesusersqlite”。
2.修改配置文件,
a.在php.ini中全局设置(*需要重启服务器)
session.save_handler=memcache
session.save_path="tcp://127.0.0.1:11211"
b.或者某个目录下的.htaccess:
php_valuesession.save_handler"memcache"
php_valuesession.save_path"tcp://127.0.0.1:11211"
c.也可以在某个一个应用中:
ini_set("session.save_handler","memcache");
ini_set("session.save_path","tcp://127.0.0.1:11211");
3.启动memcached
memcached-d-m10-uroot-l127.0.0.1-p11211-c256-P/tmp/memcached.pid
4.测试创建一个session
<?php
//set_session.php
session_start();
if(!isset($_SESSION["admin"])){
$_SESSION["TEST"]="wan";
}
print$_SESSION["admin"];
print"\n";
printsession_id();
?>
5.用sessionid去memcached里查询一下
<?php
//get_session.php
$mem=newMemcache;
$mem->connect("127.0.0.1",11211);
var_dump($mem->get("0935216dbc0d721d629f89efb89affa6"));
?>
[root@localhosthtml]#/usr/local/webserver/php/bin/php-fget_session.php
输出结果:
"admin|s:3:"wan";"
证明session正常工作。
===========================
用memcache来存储session在读写速度上应该会比文件快很多,而且在多个服务器需要共用session时会比较方便,将这些服务器都配置成使用同一组memcached服务器就可以,减少了额外的工作量。缺点是session数据都保存在内存中,不能持久化存储,如果想持久化存储,可以考虑使用Memcachedb来存储,或用TokyoTyrant+TokyoCabinet来进行存储。
怎样判断session失效了呢?在php.ini中有个Session.cookie_lifetime的选项,这个代表SessionID在客户端Cookie储存的时间,默认值是“0”,代表浏览器一关闭,SessionID就作废,这样不管保存在Memcached中的Session是否还有效(保存在Memcached中的session会利用Memcached的内部机制进行处理,即使session数据没有失效,而由于客户端的SessionID已经失效,所以这个key基本上不会有机会使用了,利用Memcached的LRU原则,如果Memcached的内存不够用了,新的数据就会取代过期以及最老的未被使用的数据),因为SessionID已经失效了,所以在客户端会重新生成一个新的SessionID。
保存在Memcached中的数据最长不会超过30天,这个时间是以操作Memcached的时间为基准的,也就是说,只要key还是原来的key,如果你重新对此key进行了相关的操作(如set操作),且重新设置了有效期,则此时此key对应的数据的有效期会重新计算的,php手册中有说明
Expirationtimeoftheitem.Ifit"sequaltozero,theitemwillneverexpire.YoucanalsouseUnixtimestamporanumberofsecondsstartingfromcurrenttime,butinthelattercasethenumberofsecondsmaynotexceed2592000(30days).
Memcached主要的cache机制是LRU(最近最少用)算法+超时失效。当您存数据到memcached中,可以指定该数据在缓存中可以呆多久。如果memcached的内存不够用了,过期的slabs会优先被替换,接着就轮到最老的未被使用的slabs。
===========================
为了使web应用能使用saas模式的大规模访问,必须实现应用的集群部署.要实现集群部署主要需要实现session共享机制,使得多台应用服务器之间会话统一,tomcat等多数服务都采用了session复制技术实现session的共享.
session复制技术的问题:
(1)技术复杂,必须在同一种中间件之间完成(如:tomcat-tomcat之间).
(2)在节点持续增多的情况下,session复制带来的性能损失会快速增加.特别是当session中保存了较大的对象,而且对象变化较快时,性能下降更加显著.这种特性使得web应用的水平扩展受到了限制.
session共享的另一种思路就是把session集中起来管理,首先想到的是采用数据库来集中存储session,但数据库是文件存储相对内存慢了一个数量级,同时这势必加大数据库系统的负担.所以需要一种既速度快又能远程集中存储的服务,所以就想到了memcached.
使用过程注意几个问题和改进思路:
1、memcache的内存应该足够大,这样不会出现用户session从Cache中被清除的问题(可以关闭memcached的对象退出机制)。
2、如果session的读取比写入要多很多,可以在memcache前再加一个Oscache等本地缓存,减少对memcache的读操作,从而减小网络开销,提高性能。
3、如果用户非常多,可以使用memcached组,通过set方法中带hashCode,插入到某个memcached服务器
(2)保存在缓存中的对象设置一个失效时间,通过过滤器获取sessionId的值,定期刷新memcached中的对象.长时间没有被刷新的对象自动被清除.(相对复杂,消耗资源)
相关文章
- php学习
- 如何使用PHP连接MySQL数据库(php如何关联mysql)
- 如何在Linux中配置PHP(linux怎么配置php)
- 安装安装Linux下的64位PHP(linux64位php)
- 一步到位:Linux下快速搭建PHP环境(linux一键php环境搭建)
- Linux下构建高性能PHP环境(linux下的php)
- 使用PHP执行Linux脚本:简单而快速!(php执行linux脚本)
- PHP操作MySQL数据库,实现强大的数据功能(php调用mysql数据库)
- 实现Linux版PHP动态编译——一案子的艰辛实践(php编译linux)
- 脚本Linux下使用PHP启动脚本指南(linux下php启动)
- Linux上PHP重装教程(linux重装php)
- PHP实现在Linux系统中进行文件操作(php写linux文件)
- 使用PHP在Linux系统中运行命令(php运行linux命令)
- MySQL实现PHP数组存储的效果(mysql存储数组php)
- 快速学习PHP Redis的使用方法(php redis怎么用)
- 使用PHP编辑器轻松编写Linux平台代码(php编辑器linux)
- 使用PHP扩展开发MSSQL应用(php扩展使用mssql)
- 使用PHP封装MSSQL管理数据库(php封装mssql)
- 据使用PHP和MSSQL技术记录丰富的数据信息(php mssql记录数)
- PHP脚本管理MSSQL数据库:优化时间精度(php mssql 时间)
- 使用Linux发布PHP网站:让你的站点稳定高效(linux发布php网站)
- 深入学习Linux下的PHP编程技巧(linux下php编程)
- 深入Linux:高效部署PHP项目(linux部署php项目)
- 检查PHP Redis环境实现快速可靠性服务(检查php redis)
- 非常好的php目录导航文件代码
- 优化使用mysql存储session的php代码
- 解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
- PHP内核探索:变量存储与类型使用说明