php利用memcache 存session 丢数据的问题
先上测试代码,大家也可以测试下
index.php
<?php
session_start();
$method = $_GET['Method'];
if(isset($_SESSION['Method'])){
$_SESSION['Method'] = $_SESSION['Method'].$method;
}else{
$_SESSION['Method'] =$method;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<script type="text/javascript" src="http://127.0.0.1/?Method=1" reload="1"></script>
<script type="text/javascript" src="http://127.0.0.1/?Method=2" reload="1"></script>
<script type="text/javascript" src="http://127.0.0.1/?Method=3" reload="1"></script>
<script type="text/javascript" src="http://127.0.0.1/?Method=4" reload="1"></script>
<script type="text/javascript" src="http://127.0.0.1/?Method=5" reload="1"></script>
<script type="text/javascript" src="http://127.0.0.1/?Method=6" reload="1"></script>
<body>
</body>
</html>
<?php
//设定 SESSION 有效时间,单位是 秒
define('SESS_LIFTTIME', 3600);
//定义memcache配置信息
define('MEMCACHE_HOST', 'localhost');
define('MEMCACHE_PORT', '11211');
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()
{
$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();
?>
<?php
require 'memcache_session.php';
$method = $_GET['Method'];
if(isset($_SESSION['Method'])){
$_SESSION['Method'] = $_SESSION['Method'].$method;
}else{
$_SESSION['Method'] =$method;
}
echo "var test={$_SESSION['Method']}";
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<script type="text/javascript" src="http://localhost/session/session_test.php?Method=1" reload="1"></script>
<script type="text/javascript" src="http://localhost/session/session_test.php?Method=2" reload="1"></script>
<script type="text/javascript" src="http://localhost/session/session_test.php?Method=3" reload="1"></script>
<script type="text/javascript" src="http://localhost/session/session_test.php?Method=4" reload="1"></script>
<script type="text/javascript" src="http://localhost/session/session_test.php?Method=5" reload="1"></script>
<script type="text/javascript" src="http://localhost/session/session_test.php?Method=6" reload="1"></script>
<body>
</body>
</html>