可不可以将数据库读取的用户所有数据都保存在$_SESSION里?

daohu

上周问了一个关于global疑似失效的问题
http://wenda.workerman.net/?/question/2112

我游戏里的操作是,玩家登录后从数据库读取用户信息,然后global &user,&bag.........
然后通信需要改变数值的时候先global &user,&bag,再比对值,比对正确就改变,不对则报作弊
实际情况是经常无缘无故报作弊。让我以为是再调用这个global &user,&bag的时候数据失效了,钻入了进程间不共享的情况。

后来测出来结果出乎我的意料,我本以为client_id和global一一对应,结果造成错误的原因是,这个global是在内存中共享的,也就是所有玩家登陆后都要用这个global &user,&bag里的值,这必然造成数据比对错误...

现在问题找到,我想用户的数据库数据只给自己用,不和其他玩家有互换。想到$_SESSION是和client_id对应的。所以理论上应该可以每次数据库获取&user,&bag....等等后,
先$_SESSION=&user;
$_SESSION=&bag;
......
每次用的时候再&user=$_SESSION;
&bag=$_SESSION;
用完再存,看起来可以这么实现。但是对于用户数据特别多的情况,会不会引发性能的问题,因为手册里说每次通信都会携带这个$_SESSION,并且这么存保险的保险,还请大神抽空解答一下。

另外,数据库的实例&db是否也可以这样放进去$_SESSION=&db; 谢谢!

2800 3 0
3个回答

daohu

现在迷茫了,同样的代码没动,有时候global全用户共享,有时候和client_id一一对应。希望大神可以指点一下疑惑

  • 暂无评论
tianhuo1990

我自己的理解是,global对该进程全体共享。
但是多个进程之间的global不同享

  • daohu 2017-08-14

    谢谢,目前来看是这样的,所以我尝试把单个用户的数据在登录完后全部放到$_SESSION里,然后把$_SESSION当临时数据库去比对通信的值,不知这样有没有问题

  • tianhuo1990 2017-08-14

    我也曾经遇到过你这个问题,我现在解决办法就是连接上了就把$client_id写入到用户表里面,然后断线的话就把这个字段清空
    当然你可以把一些数据读取出来放在session减少io

lalala

用GlobalData,多进程之间共享数据
http://doc.workerman.net/315189

  • daohu 2017-08-16

    谢谢,我不需要进程间共享,我只需要用户的数据可以存在内存里随时给自己用二不需要一直读取数据库,用$_SESSION感觉更方便嘛,就是不知会不会产生其他问题

年代过于久远,无法发表回答
🔝