$_SESSION覆盖存储是不是有问题?

shad4ever

在onMessage里面有如下代码片段:

if (!isset($_SESSION))
{
    $_SESSION = 0;
}

$lastMsgId = $_SESSION;
$curMsgId = $lastMsgId + 1;
$msgId = $msg->getMsgId();
if ($msgId != $curMsgId)
{
    // 客户端消息ID从1开始
    // 消息ID不连续,关闭连接
    LocalLogger::warning(__FILE__, __LINE__, "HallService::onMessage msg $msgId curMsg $curMsgId Error data from client $client_id .");
    Gateway::closeClient($client_id);
    return;
}

$_SESSION += 1;

假如客户端连续发送两条消息,第二条消息中的lastReceivedMsgId字段有几率会来不及更新的,取的是老的数据,目前我们的解决方法是直接在进程中用clientId作为key值的数组去保存可以解决。这里是想和作者探讨下这样设计是有什么用途?或者在响应同一客户端的请求的时候,是不是不用覆盖的方式用增量更新的方式更为妥当?

阅读 2245
2个回答

walkor

session的存储是异步非阻塞的,如果一个client快速连续更新session,可能会有session更新不及时,读到旧的session的问题,目前的解决方法是在需要连续更新session使用session的地方,用Gateway::getSession($client_id) 同步阻塞的方法获取session。也就是在使用session前写一句$_SESSiON = Gateway::getSession($client_id);,onMessage回调里写一句即可。

  • 暂无评论
shad4ever

好的,感谢!

  • 暂无评论