session设置和获取的bug,如果session数组中存在一个二维数组 用updateSession函数对本链接更新那个二维数组会有bug

479820787

先初始化当前client_id的session 为array('id'=>'1','group'=>array('a'=>'aaa','b'=>'bbb'));
然后调用 Gateway::updateSession更新当前client_id的session传入参数array('group'=>array('c'=>'ccc'))
这时候当前链接的全局变量$_SESSION的值变为了array('id'=>'1','group'=>array('c'=>'ccc'));
当前client_id或其他链接调用Gateway::getSession获取这个链接的session拿到的值为
array('id'=>'1','group'=>array('a'=>'aaa','b'=>'bbb','c'=>'ccc'));
查看原因应该是\vendor\workerman\gateway-worker\src\Lib\Gateway.php 中的updateSession函数对$_SESSION做的操作是$_SESSION = $session + (array)$_SESSION;(见附件1)
而接收请求函数vendor\workerman\gateway-worker\src\Gateway.php中的onWorkerMessage()函数接收到到更新session的请求后,对session做的处理方式是(见附件2)

$session = Context::sessionDecode($this->_clientConnections->session);
$session_for_merge = Context::sessionDecode($data);
$session = array_replace_recursive($session, $session_for_merge);
$this->_clientConnections->session = Context::sessionEncode($session);

结果就导致 $this->_clientConnections->session 和$_SESSION不一致处理失败 不明白作者为什么不用同一个函数处理session数组。也不敢轻易改动源码希望作者看到后讲解下是不是改掉$_SESSION = $session + (array)$_SESSION;就能好。

2981 1 0
1个回答

walkor

感谢反馈,已经修复,更新GatewayWorker到 3.0.11。 对workerman无影响

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