設置定時器,用于用戶重新連接,避免頻繁廣播,但是運行后時好時壞
<?php
namespace Core;
use Core\Site;
use \GatewayWorker\Lib\Gateway;
use Core\RCache;
use Workerman\Lib\Timer;
class Toos extends Site{
//當前連接的所有用戶 封裝 后續(xù)并發(fā)多了采用nosql存儲 例如memcache redis
private static $_redis = array(
"host" => "127.0.0.1",
"port" => 6379,
);
//實例對象
private static $Instance = null;
//私有 禁止外部實例化 防止數(shù)據(jù)分散
protected function __construct(){}
protected function __clone(){}
/**
* 取得類實例
* @static
* @access public
* @return object
*/
public static function getInstance() {
if(!(self::$Instance instanceof self)){
self::$Instance = new self;
}
return self::$Instance;
}
/**
* 獲取一個用戶
* @static
* @access public
* @param Int $id
* @return array || null
*/
public static function getUserOne($uid = 0){
$Redis = Redis::getInstance(self::$_redis);
return @unserialize($Redis->get($uid));
}
/**
* 設置一個用戶
* @static
* @access public
* @param Int $id
* @return void
*/
public static function setUserOne($uid = 0 , $user = array()){
$Redis = Redis::getInstance(self::$_redis);
$Redis->set($uid,serialize($user));
}
/**
* 清除一個用戶
* @static
* @access public
* @param Int $id
* @return void
*/
public static function delUserOne($uid = 0){
$Redis = Redis::getInstance(self::$_redis);
$Redis->del($uid);
}
/**
* 用戶登陸,初始化信息.
*
* @static
* @access public
* @param Int $id
* @param String $client_id
* @return aray
*/
public static function login($id = 0 , $client_id = ''){
//檢測是否是重新連接 包括刷新
$user = self::clientIsReconnect($id);
//設置session
empty($user) && $user = time();
$user = $id;
Gateway::setSession($client_id, $user);
self::setUserOne($id , array('client'=>$client_id));
Gateway::bindUid($client_id,$id);//綁定此用戶與當前客戶端的id
return self::createResponse("user login successed!" , "login" , 200);
}
/**
* 當前用戶是否是重新鏈接的
*
* @static
* @access public
* @param Int $id
* @param String $client_id
* @return bool
*/
public static function clientIsReconnect($id){
$user = self::getUserOne($id);
if($user){
//存在 正在重新鏈接 刪除定時器
if(isset($user) && !is_null($user)){
echo "Timerdel \n";
Timer::del($user);
unset($user);
}
}
return $user;
}
/**
* 退出當前登陸
*
* @static
* @access public
* @param String $client_id
* @param Array $session
* @return void
*/
public static function logout($client_id , $session = array()){
$uid = isset($session) ? (int) $session : 0;
if($uid <= 0)return;
$user = self::getUserOne($uid);
//設置定時器 1分鐘內不連接上來則認為下線
$user = Timer::add(7, array('Core\Toos', 'clearUser'), array($uid), false);
echo "set timer_id\n";
//var_dump($user);
self::setUserOne($uid ,$user);
}
/**
* 用戶徹底下線 清除用戶
*
* @static
* @access public
* @param Int $uid
* @return void
*/
public static function clearUser($uid = 0){
echo "del {$uid}\n";
}
/**
* 心跳包
*
* @static
* @access public
* @return void
*/
public static function heartBeat(){
//echo "heartBeat。。。。\n";
return;
}
}
0個回答
年代過于久遠,無法發(fā)表回答