首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

php利用memcache 存session 丢数据的有关问题

2013-09-06 
php利用memcache 存session 丢数据的问题先上测试代码,大家也可以测试下index.php?phpsession_start()$m

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>

热点排行