在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值的数组去保存可以解决。这里是想和作者探讨下这样设计是有什么用途?或者在响应同一客户端的请求的时候,是不是不用覆盖的方式用增量更新的方式更为妥当?
session的存储是异步非阻塞的,如果一个client快速连续更新session,可能会有session更新不及时,读到旧的session的问题,目前的解决方法是在需要连续更新session使用session的地方,用Gateway::getSession($client_id) 同步阻塞的方法获取session。也就是在使用session前写一句$_SESSiON = Gateway::getSession($client_id);,onMessage回调里写一句即可。
好的,感谢!