利用Memcached在php下实现session机制 替换PHP的原生session支持


Posted in PHP onAugust 21, 2010

方法文件
session实现文件:memcachedsession.php
实现原理(也是PHP内部session的实现原理):
1.先判断客户端有没有sessionid,
a.没有就添加一个sessionid给客户端,通常是32位hash码,同时初始化一个数组做session容器
b.如果客户端有sessionid,则利用这个sessionid去memcached里面查数据。
2.用户在页面执行过程中可以自行修改session容器里的session值
3.页面最后会把用户的session容器作为值,以用户的sessionid作为键,把这个键值对保存到
memcached里面

<?php 
//memcached服务器连接地址 
$_MEMCACHEAUTH = array( 
'host' => 'localhost' 
, 'port' => 11211 
); 
/* 
获取一些初始化设置值 
*/ 
$_SESSION_NAME = ini_get("session.name"); //sessionid的名称 
$_SESSION_TIME = ini_get("session.cookie_lifetime"); //sessionid这个cookie的最大保存时间 
$_SESSION_EXPIRE = ini_get("session.gc_maxlifetime"); //session键值对在memcached里面的过期时间 
$_SESSION_MEMKEY = ""; //sessionid值 
/* 
自定义的_session_start()方法,替换PHP的原生session_start()方法 
逻辑应该是比较清楚的 
*/ 
function _session_start() 
{ 
global $_SESSION_NAME, $_SESSION_TIME, $_SESSION_MEMKEY; 
global $_SESSION; 
global $_MEMCACHEAUTH, $_sessionmem; 
$_sessionmem = memcache_connect($_MEMCACHEAUTH['host'], $_MEMCACHEAUTH['port']); 
if ( empty($_COOKIE[$_SESSION_NAME]) ) 
{ 
$_SESSION_MEMKEY = md5( uniqid() ); 
setcookie($_SESSION_NAME, $_SESSION_MEMKEY , $_SESSION_TIME, "/"); 
$_SESSION = array(); 
} 
else 
{ 
$_SESSION_MEMKEY = $_COOKIE[$_SESSION_NAME]; 
$_SESSION = memcache_get($_sessionmem, $_SESSION_MEMKEY ); 
if ( $_SESSION === FALSE ) 
{ 
$_SESSION = array(); 
} 
} 
//注册一个handler,这个函数会在页面执行完的时候执行 
register_shutdown_function("_session_save_handler"); 
} 
/* 
页面最后执行的方法,用于保存session值,以及关闭memcached连接 
*/ 
function _session_save_handler() 
{ 
global $_sessionmem; 
global $_SESSION, $_SESSION_NAME, $_SESSION_EXPIRE, $_SESSION_MEMKEY; 
memcache_set($_sessionmem, $_SESSION_MEMKEY, $_SESSION, 0, $_SESSION_EXPIRE); 
memcache_close($_sessionmem); 
} 
?>

测试文件:
设置session值
<?php 
/* 
设置session值文件:session_set.php 
*/ 
include_once "memcachedsession.php"; 
_session_start(); 
$_SESSION['a'] = time(); 
?>

获取session值
<?php 
/* 
获取session值文件:session_get.php 
*/ 
include_once "memcachedsession.php"; 
_session_start(); 
function getsession() 
{ 
echo $_SESSION['a']; 
} 
getsession(); 
?>

Memcached的缓冲应用还是非常不错滴,呵呵,,,
转载:jincon's 包 blog http://www.yi1.com.cn
PHP 相关文章推荐
php array的学习笔记
May 10 PHP
PHP 文本文章分页代码 按标记或长度(不涉及数据库)
Jun 07 PHP
PHP生成自定义长度随机字符串的函数分享
May 04 PHP
浅谈php冒泡排序
Dec 30 PHP
PHP Reflection API详解
May 12 PHP
PHP的Yii框架中Model模型的学习教程
Mar 29 PHP
PHP框架性能测试报告
May 08 PHP
thinkPHP实现的联动菜单功能详解
May 05 PHP
PHP将数据导出Excel表中的实例(投机型)
Jul 31 PHP
Yii框架日志记录Logging操作示例
Jul 12 PHP
PHP+RabbitMQ实现消息队列的完整代码
Mar 20 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
Jul 01 PHP
ThinkPHP中实例Model方法的区别说明
Aug 21 #PHP
PHP 数组基础知识小结
Aug 20 #PHP
一个简单php扩展介绍与开发教程
Aug 19 #PHP
php checkbox 取值详细说明
Aug 19 #PHP
PHP 截取字符串专题集合
Aug 19 #PHP
php 过滤器实现代码
Aug 09 #PHP
PHP对字符串的递增运算分析
Aug 08 #PHP
You might like
PHP简单判断iPhone、iPad、Android及PC设备的方法
2016/10/11 PHP
php生成与读取excel文件
2016/10/14 PHP
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
Vue数据绑定实例写法
2019/08/06 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
python zip文件 压缩
2008/12/24 Python
Python使用MD5加密算法对字符串进行加密操作示例
2018/03/30 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
tensorflow与numpy的版本兼容性问题的解决
2021/01/08 Python
自我鉴定书面格式
2014/01/13 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
创业融资计划书
2014/04/25 职场文书
农业项目建议书
2014/08/25 职场文书
商家认证委托书格式
2014/10/16 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
大学生军训感言
2015/08/01 职场文书
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
Python中的 enumerate和zip详情
2022/05/30 Python
MySQL深分页问题解决思路
2022/12/24 MySQL