用戶連上來時服務器判斷如果是剛連的就發(fā)一個需要驗證信息的命令讓用戶馬上驗證身份,具體要怎么做?
可以使用定時器,在客戶端onConnect后多久沒有發(fā)送數(shù)據(jù)過來就close掉
如果是基于worker做的代碼類似如下
$worker = new Worker(...);
$worker->onConnect = function($connection)
{
$timeout = 5;
// 這里timerId是給connection動態(tài)添加的屬性,用來保存這個connection的關連接的定時器id
// 方便后面身份驗證后刪除定時器
$connection->timerId = Timer::add($timeout, function($connection){
$connection->close();
}, array($connection), false);
};
$worker->onMessage = function($connection, $data)
{
// $connection->timerId不為空,則該連接還沒驗證,則嘗試驗證
if(!empty($connection->timerId))
{
// 你的驗證函數(shù),驗證ok
if(you_check_auth_func($data))
{
// 刪除定時器
Timer::del($connection->timerId);
// 刪除timerId,標記已經(jīng)驗證ok
$connection->timerId = null;
}
// 沒通過驗證則關閉連接
else
{
$connection->close();
}
}
};
如果是基于GatewayWorker做的
簡單的方法是使用心跳來做,服務端設置心跳間隔,如果客戶端在制定時間內(nèi)沒有發(fā)來數(shù)據(jù)則斷開連接。參考手冊 http://gatewayworker-doc.workerman.net/gateway-worker-development/heartbeat.html
如果覺得心跳不能滿足要求,下面是GatewayWorker的做法,與基于worker的方法類似
class Event
{
public static function onConnect($client_id)
{
// 設置一個定時器,$timeout 秒后關閉連接
$timeout = 5;
$_SESSION = Timer::add($timeout, function($client_id){
Gateway::closeClient($client_id);
}, array($client_id), false);
}
public static function onMessage($client_id, $data)
{
// 如果沒有驗證過則嘗試驗證
if(!empty($_SESSION))
{
// 驗證通過
if(your_check_auth_func($data))
{
// 刪除定時器
Timer::del($_SESSION);
// 刪除timerId,標記已經(jīng)驗證ok
unset($_SESSION);
}
// 沒驗證通過則關閉連接?
else
{
Gateway::closeClient($client_id);
}
}
.....
}
}