作/译者:叶金荣(Email:imysql@imysql.cn ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究。
本文是 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();
?>