资讯专栏INFORMATION COLUMN

用Swoole快速搭建一个推送服务器

Moxmi / 2967人阅读

摘要:环境扩展需求实现简单的广播支持身份验证源码废话少说,上代码使用实例就会以守护进程方式运行客户端代码搭建过程非常方便。实现的比较简陋,但是可以满足一般的需求了。支持身份验证功能,验证不通过会自动踢掉。

环境

php5.6+

swoole扩展

需求

实现简单的广播, 支持身份验证

源码

废话少说,上代码.

host = $host;
        $this->port = $port;    
        $this->config = $config;
        $this->init();
    } 

    public function init()
    {
        $this->server = new Server($this->host, $this->port);
        !empty($this->config) && $this->server->set($this->config);

        $this->beforeSendMsgCallback = function() {};
        $this->afterSendMsgCallback = function() {};
        $this->beforeAuthCallback = function() {};
        $this->afterAuthCallback = function() {};
        $this->authenticator = function() {};
        $this->bindEvents();
    }

    public function bindEvents()
    {
        $this->server->on("open", [$this, "onOpen"]);
        $this->server->on("message", [$this, "onMessage"]);
        $this->server->on("close", [$this, "onClose"]);
    }

    public function run()
    {
       $this->server->start(); 
    }
    
    public function onOpen(Server $server, $request)
    {
        call_user_func($this->beforeAuthCallback, $server, $request);
        if (!$this->auth($request)) {
            return;
        }
        $this->customers[] = $request->fd;
        call_user_func($this->afterAuthCallback, $server, $request);
    }

    public function onMessage(Server $server, $frame)
    {
        call_user_func($this->beforeSendMsgCallback, $server, $frame);
        $this->broadcast($frame->fd, $frame->data);
        call_user_func($this->afterSendMsgCallback, $server, $frame);
    }

    public function onClose($ser, $fd)
    {
        $key = array_search($fd, $this->customers);
        unset($this->customers[$key]);
    }

    public function __call($method, $params)
    {
        $class_name = get_class($this->server);
        $class = new ReflectionClass($class_name);

        try {
            $class->getMethod($method);
        } catch (ReflectionException $e) {
            echo "Method $method is not exists
";
            return;
        }

        call_user_func_array([$this->server, $method], $params);
    }

    public function broadcast($fromUser, $messages)
    {
        $users = array_diff($this->customers, [$fromUser]);
        foreach ($users as $user)
        {
            $this->server->push($user, $messages);
        }
    }

    private function auth($request)
    {
        if (($result = call_user_func($this->authenticator, $request)) === false) {
            $this->server->push($request->fd, "auth failed");
            $this->server->close($request->fd);
        }

        return $result;
    }


}
使用实例
 1,
]);

$server->authenticator = function($request) use ($server) {
    $get = $request->get;
    return empty($get) || ($get["access_token"] == "access_token");
};

$server->afterAuthCallback = function($ser, $request) use ($server) {
    $server->push($request->fd, "auth successful"); 
};

$server->run();
php index.php  #就会以守护进程方式运行

客户端js代码:

var websocket = new WebSocket("ws://192.168.2.106:9501?access_token=access_token");
websocket.onopen=function(evt) {

};

websocket.onmessage = function(evt) {
    console.log(evt);
};

websocket.onclose = function(evt) {
  console.log(evt);
};

搭建过程非常方便。实现的比较简陋,但是可以满足一般的需求了。支持身份验证功能,验证不通过会自动踢掉。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25591.html

相关文章

  • Swoole学习手记(一)初识Swoole

    摘要:目录初识创建服务器上创建服务器下异步任务持续更新中。。。参加工作有一段时间了,偶尔会听到,对我这种小白粗略看下文档都会觉得很牛逼。个人理解就是解决这样应用场景的。 目录 初识Swoole 创建服务器(上) 创建服务器(下) 异步任务task 持续更新中。。。 参加工作有一段时间了,偶尔会听到swoole,对我这种PHP小白粗略看下文档都会觉得很牛逼。由于学习成本比较高,自身对网络异...

    yeyan1996 评论0 收藏0
  • 基于 Swoole 构建的 CTF AWD 比赛环境搭建与实践

    摘要:出题思路本次题目来自于我的一个外包项目实践。回合制比赛以分钟为一回合。选手在比赛过程中需要盗取到对手的密钥,以窃听他方内容,并修改己方密钥以放泄露动态该部分同样由中心服务器与完成。 Author: RytiaDate: 20190427Blog: www.zzfly.net本人才学疏浅,望君不吝赐教 背景 受学校老师邀请,为学弟学妹举办分享会介绍 AWD 相关经验,本人一时头脑风暴采用...

    GitCafe 评论0 收藏0
  • php只能做网站?基于swoole+websocket开发双向通信应

    摘要:那么,是否就无法用来开发双向通信的应用呢答案是否定的。内置通信支持,可以与程序基于进行双向通信。通信协议于年被定为标准,并由补充规范。前言 众所周知,PHP用于开发基于HTTP协议的网站应用非常便捷。而HTTP协议是一种单向的通信协议,只能接收客户端的请求,然后响应请求,不能主动向客户端推送信息。因此,一些实时性要求比较高的应用,如实时聊天、直播应用、在线网页游戏等,就不适合采用HTTP协议...

    番茄西红柿 评论0 收藏0
  • php只能做网站?基于swoole+websocket开发双向通信应

    摘要:那么,是否就无法用来开发双向通信的应用呢答案是否定的。内置通信支持,可以与程序基于进行双向通信。通信协议于年被定为标准,并由补充规范。前言 众所周知,PHP用于开发基于HTTP协议的网站应用非常便捷。而HTTP协议是一种单向的通信协议,只能接收客户端的请求,然后响应请求,不能主动向客户端推送信息。因此,一些实时性要求比较高的应用,如实时聊天、直播应用、在线网页游戏等,就不适合采用HTTP协议...

    琛h。 评论0 收藏0
  • 实战 swoole【聊天室】

    摘要:是一个请求对象,包含了客户端发来的握手请求信息事件函数中可以调用向客户端发送数据或者调用关闭连接事件回调是可选的当服务器收到来自客户端的数据帧时会回调此函数。 前言:了解概念之后就应该练练手啦,不然就是巨婴 有收获的话请加颗小星星,没有收获的话可以 反对 没有帮助 举报三连 代码仓库 实战swoole【聊天室】 在线体验 准备工作 需要先看初识swoole【上】,了解基本的服务端...

    andycall 评论0 收藏0

发表评论

0条评论

Moxmi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<