日期:2014-05-17  浏览次数:20545 次

PHP实现多服务器session共享之memcache共享

使用基于文件的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");

PHP实现多服务器session共享之memcache共享

再自定义一套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.net
 */

//设定 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)