时间: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的实现方法我就不再多讲,直接贴程序了。
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
用 sessionid 去 memcached 里查询一下
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