php : tp框架swoole實現websocket,wss

曲帥369發表於2020-12-26
class Swoole extends \think\swoole\Server
{
    protected static $token;
    protected $host = '0.0.0.0';
    protected $port = 9503;
    //protected $serverType = 'socket';
    protected $serverType = 'ssl';
    protected static $uid = '';
    protected $mode = SWOOLE_PROCESS;
    protected $sockType = SWOOLE_SOCK_TCP | SWOOLE_SSL;
    protected $option = [
        'worker_num' => 4, // 設定啟動的Worker程式數
        'daemonize' => true, //守護程式化。
        'backlog' => 128, //Listen佇列長度,
        'dispatch_mode' => 2,
        'heartbeat_check_interval' => 5, //5秒跟新
        'heartbeat_idle_time' => 100,    //連線超時
        'ssl_cert_file' => "/www/cert/wss.qhoo.top.pem",
        'ssl_key_file'  => "/www/cert/wss.qhoo.top.key"
    ];

    //連線
    public function onOpen( $server,  $req)
    {
        //fd:進入ws給的id每次進入都會變
        $fd = $req->fd;
        //token={{$token}}&appid={{$appid}}&nonce={{$nonce}}&timestamps={{$timestamps}}
        $token = $req->get['token'];
        $appid = $req->get['appid'];
        $nonce = $req->get['nonce'];
        $timestamps = $req->get['timestamps'];
        $tokens = md5($appid.'hudong233'.$nonce.$timestamps);
        if($token !== $tokens) {

            $server->push($fd, Tool::showAjax(['status' => 3, 'message' => '請先登入!']));
            $server->close($fd);
            return;
        }
      /*  //獲取openid;
        $token = $req->get['token'] ?? '';    //拿到客戶端使用者ID
        if (!$token) {
            $server->push($fd, Tool::showAjax(['status' => 3, 'message' => '請先登入!']));
            $server->close($fd);
            return;
        }
        //可以存入登陸狀態
        $userData = Cache::get($token);
        if (!$userData) {
            $server->push($fd, Tool::showAjax(['status' => 2, 'message' => '使用者身份無效,請重新登入!']));
            $server->close($fd);
            return;
        }

        self::$uid = $req->get['friendId'];
        if (self::$uid == $userData['uid']) {
            //傳送資料
            $server->push($fd, Tool::showAjax(['status' => 2, 'message' => '非法操作!']));
            $server->close($fd);
        }
        $server->bind($fd, $userData['uid']);
        $messages = Message::getMessage($userData['uid']);
        //$req->fd 伺服器識別id(會變)
        (new UserModel())->where('id', $userData['uid'])->update(['fd' => $req->fd]);
        $arr = $messages->toArray();
        sort($arr);*/

        $server->push($fd, Tool::showAjax(['status' => 1, 'message' => 'success', 'data' => '888']));
    }


    //接受資料
    public function onMessage($server,  $frame)
    {
        //$frame->data 傳送的資料
        //$frame->fd   傳送人的伺服器id
        $message = $frame->data;
        if (empty($message)) return;
        //$message = file_put_contents("./log.txt", "$message", FILE_APPEND);
        //給所有人傳送
        db('user')->insert(['v'=>$message]);
        foreach ($server->connections as $key => $value) {
            $server->push($value, Tool::showAjax(['status' => 1, 'message' => 'success', 'data' => $message]));
            //$ws->push($value, $data1);
        }
        //$server->push($frame->fd, Tool::showAjax(['status' => 1, 'message' => 'success', 'data' => $arr]));
    }

    function onClose( $server, int $fd, int $reactorId)
    {
        /*(new UserModel())->where('fd', $fd)->update(['fd' => '']);*/
    }
    //
    private function open1($server,$req) {
        //fd:進入ws給的id每次進入都會變
        $fd = $req->fd;
        //獲取openid;
        $token = $req->get['token'] ?? '';    //拿到客戶端使用者ID
        if (!$token) {
            $server->push($fd, Tool::showAjax(['status' => 3, 'message' => '請先登入!']));
            $server->close($fd);
            return;
        }
        //可以存入登陸狀態
        $userData = Cache::get($token);
        if (!$userData) {
            $server->push($fd, Tool::showAjax(['status' => 2, 'message' => '使用者身份無效,請重新登入!']));
            $server->close($fd);
            return;
        }

        self::$uid = $req->get['friendId'];
        if (self::$uid == $userData['uid']) {
            $server->push($fd, Tool::showAjax(['status' => 2, 'message' => '非法操作!']));
            $server->close($fd);
        }
        $server->bind($fd, $userData['uid']);
        $messages = Message::getMessage($userData['uid']);
        //$req->fd 伺服器識別id(會變)
        (new UserModel())->where('id', $userData['uid'])->update(['fd' => $req->fd]);
        $arr = $messages->toArray();
        sort($arr);

        $server->push($fd, Tool::showAjax(['status' => 1, 'message' => 'success', 'data' => $arr]));
    }
}

 

相關文章