* @copyright walkor * @link http://www.workerman.net/ * @license http://www.opensource.org/licenses/mit-license.php MIT License */ /** * 用于检测业务代码死循环或者长时间阻塞等问题 * 如果发现业务卡死,可以将下面declare打开(去掉//注释),并执行php start.php reload * 然后观察一段时间workerman.log看是否有process_timeout异常 */ //declare(ticks=1); use \GatewayWorker\Lib\Gateway; /** * 主逻辑 * 主要是处理 onConnect onMessage onClose 三个方法 * onConnect 和 onClose 如果不需要可以不用实现并删除 */ class Events { /** * 当客户端连接时触发 * 如果业务不需此回调可以删除onConnect * * @param int $client_id 连接id */ public static function onConnect($client_id) { echo "连接成功{$client_id}\n"; $auth_timer_id = \Workerman\Timer::add(20, function($client_id){ // echo "未登录断开连接\n"; Gateway::closeClient($client_id); }, array($client_id), false); Gateway::updateSession($client_id, array('auth_timer_id' => $auth_timer_id)); } /** * 当客户端发来消息时触发 * @param int $client_id 连接id * @param mixed $message 具体消息 */ public static function onMessage($client_id, $message) { $_SESSION = Gateway::getSession($client_id); $msg = json_decode($message,true); if($msg['type'] == 'login'){ \Workerman\Timer::del($_SESSION['auth_timer_id']); Gateway::bindUid($client_id,$msg['userId']); Gateway::updateSession($client_id,['userId'=>$msg['userId']]); Gateway::sendToClient($client_id, self::cjson('login',[],'登录成功')); echo "登录成功\n"; } else if($msg['type'] == 'ping'){ Gateway::sendToClient($client_id, self::cjson('pong',[],'')); return; } if(!$_SESSION['userId']){ // 未登录 Gateway::sendToClient($client_id, self::cjson('unlogin',[],'未登录')); return; } switch($msg['type']){ case 'message': break; } } /** * 当用户断开连接时触发 * @param int $client_id 连接id */ public static function onClose($client_id){ Gateway::sendToClient($client_id, self::cjson('close',[],'断开连接')); echo "断开连接\n"; } /** * 获取响应参数 * @param string $type * @param array $data * @param string $msg * @return string */ private static function cjson($type='',$data=[],$msg=''){ $jsonarr = [ 'type' => $type, 'data' => $data, 'msg' => $msg ]; return json_encode($jsonarr); } }