想请教一个问题,当我的设备在连上gateway后突然断开,是否可以通过$SESSION来获取这台设备id并更新对应的设备状态,因为我现在遇到的情况是我的设备断开了连接,触发了onclose但是$SESSION却没有值,导致无法运行update函数更新设备状态。手册上说客户端或服务端与Gateway进程的连接断开时触发onclose,而$_SESSION的生命周期与client_id对应socket连接的生命周期相同,当客户端连接断开后,对应的客户端$_SESSION将会清除。我是否可以理解为设备或服务器和gateway断开连接并不等同于设备断开socket连接,只有触发onclose才算断开socket连接?如果是如此,那为何我的onclose中session取不到值?是我的程序问题吗?还请大神赐教,以下是我的gateway程序逻辑(PS:并不是我的所有设备都出现这个问题)
public static function onMessage($client_id, $message)
{
$message = json_decode($message, true);
//获取设备编号并存入session
$_SESSION=$uid;
}
public static function onClose($client_id)
{
$SESSION=$_SESSION;
if($SESSION)
{
update($SESSION)//执行函数更新数据库中设备的状态
}
}
1、设备或服务器和gateway断开连接即代表设备或服务器断开了对应的socket连接,此时会触发 onClose 回调;
2、onClose中可以获取到 $_SESSION的值啊, 示例代码中的 $uid 哪来的? 这个“游离”变量也会导致 $_SESSION 逻辑为空。
$uid来自于$message
已知有2种原因会导致这个问题
1、客户端发起连接后没有发送数据连接就断开,也就是onMessage没有触发过
2、触发了onMessage但没走到$_SESSION赋值的业务代码
关于第1种很常见,设备发起连接后还没来得及发送数据连接已经断开。还有外网环境一些网络扫描工具扫描端口,负载均衡端口存活探测等都会产生建立连接但是不发送数据的情况。
所以如果onClose里去获得onMessage里的$_SESSION,onClose里必须要用isset判断下再使用。
关于第2种需要自行记录日志,在设置$_SESSION的时候记录下日志包括client_id,session的内容。然后在onClose里记录client_id,获取的session内容。看下onClose里获得不到session的时候是否有这个client_id设置session的日志