时间:2021-07-01 10:21:17 帮助过:4人阅读
使用基于文件的Session存取瓶颈可能都是在磁盘IO操作上,所以对付小数据量的Session没有问题,但是如果碰到大数据量的Sesstion,那么可能无法胜任,现在利用Memcache来保存Session数据,直接通过内存的方式,效率自然能够提高不少
首先打开php.ini文件,找到session的部分:(分号后面的是注释)
[Session]
; Handler used to store/retrieve data.
session.save_handler = files ;
这个是session的方式,默认的files就可以了,代表用文件储存,
还有两种方式,user和memcache。
user方式指的是你自己(也就是 用户)定义session的句柄,用于session的存取等 ,这个可以把session扩展存到数据库里
memcache方式,需要你配置好memcache ,还要配置session.save_path。
用memcache来作PHP 的session.save_handler
- ini_set("session.save_handler", "memcache");
- ini_set("session.save_path", "tcp://127.0.0.1:11211,tcp://192.168.1.12:11211");
用memcached 来作PHP 的session.save_handler
- ini_set("session.save_handler","memcached");
- ini_set("session.save_path","127.0.0.1:11211");
再自定义一套session处理机制,关于session的实现方法我就不再多讲,直接贴程序了。
- <!--?php
- /* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
- //===========================================
- // 程序: Memcache-Based Session Class
- // 功能: 基于Memcache存储的 Session 功能类
- // 作者: yejr
- // 网站: http://imysql.cn
- // 时间: 2007-01-05
- //===========================================
- /**
- * 文件: MemcacheSession.inc.php
- * 类名: MemcacheSession Class
- * 功能: 自主实现基于Memcache存储的 Session 功能
- * 描述: 这个类就是实现Session的功能,基本上是通过
- * 设置客户端的Cookie来保存SessionID,
- * 然后把用户的数据保存在服务器端,最后通过
- * Cookie中的Session Id来确定一个数据是否是用户的,
- * 然后进行相应的数据操作
- *
- * 本方式适合Memcache内存方式存储Session数据的方式,
- * 同时如果构建分布式的Memcache服务器,
- * 能够保存相当多缓存数据,并且适合用户量比较多并发比较大的情况
- *
- * 注意: 本类必须要求PHP安装了Memcache扩展或者必须有Memcache的PHP API
- * 获取Memcache扩展请访问: http://pecl.php.com
- */
- //设定 SESSION 有效时间,单位是 秒
- define('SESS_LIFTTIME', 3600);
- //定义memcache配置信息
- define('MEMCACHE_HOST', 'localhost');
- define('MEMCACHE_PORT', '10000');
- if (!defined('MemcacheSession'))
- {
- define('MemcacheSession', TRUE);
- class MemacheSession
- {
- // {{{ 类成员属性定义
- static $mSessSavePath;
- static $mSessName;
- static $mMemcacheObj;
- // }}}
- // {{{ 初始化构造函数
- /**
- * 构造函数
- *
- * @param string $login_user 登录用户
- * @param int $login_type 用户类型
- * @param string $login_sess 登录Session值
- * @return Esession
- */
- public function __construct()
- {
- //我的memcache是以php模块的方式编译进去的,可以直接调用
- //如果没有,就请自己包含 Memcache-client.php 文件
- if (!class_exists('Memcache') || !function_exists('memcache_connect'))
- {
- die('Fatal Error:Can not load Memcache extension!');
- }
- if (!empty(self::$mMemcacheObj) && is_object(self::$mMemcacheObj))
- {
- return false;
- }
- self::$mMemcacheObj = new Memcache;
- if (!self::$mMemcacheObj--->connect(MEMCACHE_HOST , MEMCACHE_PORT))
- {
- die('Fatal Error: Can not connect to memcache host '. MEMCACHE_HOST .':'. MEMCACHE_PORT);
- }
- return TRUE;
- }
- // }}}
- /** {{{ sessOpen($pSavePath, $name)
- *
- * @param String $pSavePath
- * @param String $pSessName
- *
- * @return Bool TRUE/FALSE
- */
- public function sessOpen($pSavePath = '', $pSessName = '')
- {
- self::$mSessSavePath = $pSavePath;
- self::$mSessName = $pSessName;
- return TRUE;
- }
- // }}}
- /** {{{ sessClose()
- *
- * @param NULL
- *
- * @return Bool TRUE/FALSE
- */
- public function sessClose()
- {
- return TRUE;
- }
- // }}}
- /** {{{ sessRead($wSessId)
- *
- * @param String $wSessId
- *
- * @return Bool TRUE/FALSE
- */
- public function sessRead($wSessId = '')
- {
- $wData = self::$mMemcacheObj->get($wSessId);
- //先读数据,如果没有,就初始化一个
- if (!empty($wData))
- {
- return $wData;
- }
- else
- {
- //初始化一条空记录
- $ret = self::$mMemcacheObj->set($wSessId, '', 0, SESS_LIFTTIME);
- if (TRUE != $ret)
- {
- die("Fatal Error: Session ID $wSessId init failed!");
- return FALSE;
- }
- return TRUE;
- }
- }
- // }}}
- /** {{{ sessWrite($wSessId, $wData)
- *
- * @param String $wSessId
- * @param String $wData
- *
- * @return Bool TRUE/FALSE
- */
- public function sessWrite($wSessId = '', $wData = '')
- {
- $ret = self::$mMemcacheObj->replace($wSessId, $wData, 0, SESS_LIFTTIME);
- if (TRUE != $ret)
- {
- die("Fatal Error: SessionID $wSessId Save data failed!");
- return FALSE;
- }
- return TRUE;
- }
- // }}}
- /** {{{ sessDestroy($wSessId)
- *
- * @param String $wSessId
- *
- * @return Bool TRUE/FALSE
- */
- public function sessDestroy($wSessId = '')
- {
- self::sessWrite($wSessId);
- return FALSE;
- }
- // }}}
- /** {{{ sessGc()
- *
- * @param NULL
- *
- * @return Bool TRUE/FALSE
- */
- public function sessGc()
- {
- //无需额外回收,memcache有自己的过期回收机制
- return TRUE;
- }
- // }}}
- /** {{{ initSess()
- *
- * @param NULL
- *
- * @return Bool TRUE/FALSE
- */
- public function initSess()
- {
- //不使用 GET/POST 变量方式
- ini_set('session.use_trans_sid', 0);
- //设置垃圾回收最大生存时间
- ini_set('session.gc_maxlifetime', SESS_LIFTTIME);
- //使用 COOKIE 保存 SESSION ID 的方式
- ini_set('session.use_cookies', 1);
- ini_set('session.cookie_path', '/');
- $domain = '.imysql.cn';
- //多主机共享保存 SESSION ID 的 COOKIE
- ini_set('session.cookie_domain', $domain);
- //将 session.save_handler 设置为 user,而不是默认的 files
- session_module_name('user');
- //定义 SESSION 各项操作所对应的方法名:
- session_set_save_handler(
- array('MemacheSession', 'sessOpen'), //对应于静态方法 My_Sess::open(),下同。
- array('MemacheSession', 'sessClose'),
- array('MemacheSession', 'sessRead'),
- array('MemacheSession', 'sessWrite'),
- array('MemacheSession', 'sessDestroy'),
- array('MemacheSession', 'sessGc')
- );
- session_start();
- return TRUE;
- }
- // }}}
- }//end class
- }//end define
- $memSess = new MemacheSession;
- $memSess->initSess();
- ?>
?然后,在项目程序的头文件中直接包含 MemacheSession.inc.php 即可,并且以前的程序不用做任何改动。
测试 创建一个session
- <!--?php
- //set_session.php
- session_start();
- if (!isset($_SESSION['admin'])) {
- $_SESSION['TEST'] = 'wan';
- }
- print $_SESSION['admin'];
- print "/n";
- print session_id();
- ?-->
用 sessionid 去 memcached 里查询一下
?
- <!--?php
- //get_session.php
- $mem = new Memcache;
- $mem--->connect("127.0.0.1", 11211);
- var_dump($mem->get('0935216dbc0d721d629f89efb89affa6'));
- ?>
备注:memcache PECL 未来版本中,可以直接设置 php.ini 来这定自己的 session.save_handler,大致如下:
- session.save_handler = memcache
- session.save_path = "tcp://host:port?persistent=1&weight=2&timeout=2&retry_interval=15,tcp://host2:port2"
1 楼 any_luf 2012-02-08