上周問了一個關于global疑似失效的問題
http://wenda.workerman.net/?/question/2112
我游戲里的操作是,玩家登錄后從數(shù)據(jù)庫讀取用戶信息,然后global &user,&bag.........
然后通信需要改變數(shù)值的時候先global &user,&bag,再比對值,比對正確就改變,不對則報作弊
實際情況是經(jīng)常無緣無故報作弊。讓我以為是再調用這個global &user,&bag的時候數(shù)據(jù)失效了,鉆入了進程間不共享的情況。
后來測出來結果出乎我的意料,我本以為client_id和global一一對應,結果造成錯誤的原因是,這個global是在內存中共享的,也就是所有玩家登陸后都要用這個global &user,&bag里的值,這必然造成數(shù)據(jù)比對錯誤...
現(xiàn)在問題找到,我想用戶的數(shù)據(jù)庫數(shù)據(jù)只給自己用,不和其他玩家有互換。想到$_SESSION是和client_id對應的。所以理論上應該可以每次數(shù)據(jù)庫獲取&user,&bag....等等后,
先$_SESSION=&user;
$_SESSION=&bag;
......
每次用的時候再&user=$_SESSION;
&bag=$_SESSION;
用完再存,看起來可以這么實現(xiàn)。但是對于用戶數(shù)據(jù)特別多的情況,會不會引發(fā)性能的問題,因為手冊里說每次通信都會攜帶這個$_SESSION,并且這么存保險的保險,還請大神抽空解答一下。
另外,數(shù)據(jù)庫的實例&db是否也可以這樣放進去$_SESSION=&db; 謝謝!
我自己的理解是,global對該進程全體共享。
但是多個進程之間的global不同享
謝謝,目前來看是這樣的,所以我嘗試把單個用戶的數(shù)據(jù)在登錄完后全部放到$_SESSION里,然后把$_SESSION當臨時數(shù)據(jù)庫去比對通信的值,不知這樣有沒有問題
我也曾經(jīng)遇到過你這個問題,我現(xiàn)在解決辦法就是連接上了就把$client_id寫入到用戶表里面,然后斷線的話就把這個字段清空
當然你可以把一些數(shù)據(jù)讀取出來放在session減少io
用GlobalData,多進程之間共享數(shù)據(jù)
http://doc.workerman.net/315189
謝謝,我不需要進程間共享,我只需要用戶的數(shù)據(jù)可以存在內存里隨時給自己用二不需要一直讀取數(shù)據(jù)庫,用$_SESSION感覺更方便嘛,就是不知會不會產(chǎn)生其他問題