您好,欢迎访问一九零五行业门户网

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

本文是 php实现多服务器session共享之nfs共享的延续,不过这次,我采用memcache来存储session了,memcache的安装请看这里: 搭建高效、可靠、稳定的web服务器 -- 二、) 安装mysql、memcache。 接下来,再自定义一套session处理机制,关于session的实现方法我
本文是 php实现多服务器session共享之nfs共享的延续,不过这次,我采用memcache来存储session了,memcache的安装请看这里: 搭建高效、可靠、稳定的web服务器 -- 二、) 安装mysql、memcache。
接下来,再自定义一套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()
{
$domain = '.imysql.cn';
//不使用 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', '/');
//多主机共享保存 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 即可,并且以前的程序不用做任何改动。
  特别感谢:黑夜路人 的 实现基于memcache存储的session类。
备注: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

详情请见 php_memcache.h cvs log
其它类似信息

推荐信息