利用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 相关文章推荐
删除及到期域名的查看(抢域名必备哦)
May 14 PHP
关于PHP语言构造器介绍
Jul 08 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
Oct 27 PHP
php中try catch捕获异常实例详解
Nov 21 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 PHP
ThinkPHP实现递归无级分类――代码少
Jul 29 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
可兼容php5与php7的cURL文件上传功能实例分析
May 11 PHP
PHP PDOStatement::setFetchMode讲解
Feb 03 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
Oct 17 PHP
PHP7生产环境队列Beanstalkd用法详解
May 19 PHP
PHP 时间处理类Carbon
May 20 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
GBK的页面输出JSON格式的php函数
2010/02/16 PHP
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
php无序树实现方法
2015/07/28 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
动态加载js的几种方法
2006/10/23 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
JS和JQ的event对象区别分析
2014/11/24 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
JavaScript 继承 封装 多态实现及原理详解
2019/07/29 Javascript
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
基于Python List的赋值方法
2018/06/23 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
工程承包协议书
2014/04/22 职场文书
入党推优材料
2014/06/02 职场文书
五年级小学生评语
2014/12/26 职场文书
中考学习决心书
2015/02/04 职场文书
大学生就业意向书
2015/05/11 职场文书
导游词之湖北武当山
2019/09/23 职场文书
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
vue递归实现树形组件
2022/07/15 Vue.js