读书人

php利用memcache 存session 丢数据的有

发布时间: 2013-09-06 10:17:17 作者: rapoo

php利用memcache 存session 丢数据的问题
先上测试代码,大家也可以测试下
index.php

<?php
session_start();
$method = $_GET['Method'];
if(isset($_SESSION['Method'])){
$_SESSION['Method'] = $_SESSION['Method'].$method;
}else{
$_SESSION['Method'] =$method;
}
?>

clent.html
<!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>


之后大家可以打印一下SESSION看看,结果经常会丢数据。SESSION经常就记录不全。不知道是为什么,还请高手来解释下。

下面附上我的其他配置
libevent-2.0.18-stable.tar.gz 服务器端
memcached-1.4.13.tar.gz 服务器端
memcache-2.2.6.tgz PHP客户端



PHP.ini
session.save_path="tcp://192.168.234.234:11211"
session.save_handler = memcache

PHP组件
php_memcache.dll 版本是2.2.6.0
[解决办法]
引用:
....当然是读了才发现的问题啊。。
我在memcache里遍历了数据,确实是没有写进去。并不是没读出来。
那你就是没理解我的意思
我是说:写了马上就读,能读到并不错,这才表示写进去了
你以为如何?
[解决办法]
你应该考虑到的是浏览器几乎同时并发请求的问题,你的新值是根据几毫秒前读出的值来设定的。可在这点时间里,完全有可能有新的值插入成功。如果再插入,那么将造成前面写入的新值还没被读出,反而立即被覆盖了。所以丢失数据很正常。
你完全可以在客户端或者服务器端写个测试看看,比较一下每次停顿一秒和同时并发的效果。
------解决方案--------------------


你还没说你测试页面返回的值是什么那?
看你程序你想要的结果123456.
js是顺利加载。应该没并发的问题吧。你检查数据的时候,主要检查一下sessionid

[解决办法]
使用APMserver5.2.6集成开发包,已经集成了memcache.
测试完成成功。

memcache_session.php (摘自http://imysql.cn/?q=node/215)


<?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();
?>



memcache_test.php


<?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']}";


index.html


<!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>

读书人网 >PHP

热点推荐