数组值自动改变

joker2015

我做了一个小游戏,客户端向服务器发送 '{"type":"update","boatId":"20001","y":"10"}' json数据,服务端把y 值存到数组$POSITION中,如果有新的用户进入,会先发送 '{"type":"init"}',服务端判断type为init则吧数组中的数据发送到客户端。那么问题是:每次有新的客户端打开,或者刷新页面,客户端收到的数组数据总是会变。打印$POSITION发现值每次都不一定固定。怎么回事儿?
下面是我的代码

$POSITION = array('boat1' =>0,'boat2' =>0,'boat3' =>0);

class Event
{
public static function onMessage($client_id, $message)
{
global $POSITION;

// $message = '{"type":"update","boatId":"20001","y":"1"}'
$message_data = json_decode($message, true);

if(!$message_data)
{
return ;
} 

switch($message_data)
{
case 'init':
Gateway::sendToAll(json_encode(array(
'type' => 'init',
'boat1' => $POSITION,
'boat2' => $POSITION,
'boat3' => $POSITION,
)));
return;
//更新数据
case 'update':
$boatId = $message_data;
$y = 10;
if($boatId != null){
switch($boatId){
case '20001' : $POSITION += $y; break;
case '20002' : $POSITION += $y; break;
case '20003' : $POSITION += $y; break;
}
}
Gateway::sendToAll($message);
return;
}
}
}
2269 2 0
2个回答

walkor

业务代码是在多个进程中执行的,每个进程中有一个$POSITION变量,多个进程间的$POSITION变量不会同步。

可以将$POSITION放到存储中,或者设置BusinessWorker进程数为1

  • 暂无评论
joker2015

哦,原来如此,多谢了

  • 暂无评论
年代过于久远,无法发表回答
🔝