资讯专栏INFORMATION COLUMN

利用Swoole同时更新多台服务器代码

Pines_Cheng / 732人阅读

摘要:一个小型网站的架构,前面一台负载均衡后面几台服务器更新代码成了难题一个一个传不现实而且容易漏传,导致两个服务器的代码都不一致一个简单的想法利用发送更新指令接收到更新指令运行更新代码有几个角色接收命令不能发送命令发送命令流程图部分代码实现

一个小型网站的架构, 前面一台负载均衡, 后面几台web服务器. 更新代码成了难题, 一个一个FTP传不现实, 而且容易漏传,导致两个WEB服务器的代码都不一致.

一个简单的想法:

利用Websocket Server发送更新指令, Websocket Client 接收到更新指令, 运行git pull更新代码.

WebSocket Client有几个角色:

Solider: 接收命令, 不能发送命令

Commander: 发送命令

流程图:

部分代码实现:

table = new Table();
        $this->server = new WebSocketServer($config["host"], $config["port"]);
        $this->server->set($config["configuration"]);
        $this->addEventListener();
    }

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

    private function onOpen($server, $request)
    {
        if ($request->get["role"] == "commander") {
            $this->table->commander = $request->fd;
        } else {
            $soliders = $this->table->soliders;

            $soliders[] = $request->fd;

            $this->table->soliders = $soliders;
        }
    }

    private function onMessage($server, $frame)
    {
        if ($frame->fd == $this->table->commander) {
            $command = $frame->data;

            foreach ($this->table->soliders as $solider) {
                $this->server->push($solider, $command);
            }
        } else {
            $this->server->push($frame->fd, "You don not have any right to send message");
        }
    }

    private function onClose($server, $fd)
    {
        $soliders = $this->table->soliders;

        if (in_array($fd, $soliders)) {
            unset($soliders[array_search($fd, $soliders)]);
        }
    }

    public function run()
    {
        $this->server->start();
    }
}

$server = new Server([
    "host" => "0.0.0.0",
    "port" => 8015,
    "configuration" => [
        "daemonize" => 1,
    ]
]);

$server->run();
 $this->protocol, "host" => $this->host, "port" => $this->port, "query" => $this->query) = parse_url($url);

        if ($this->protocol == "wss") {
            echo "unsupport protocol";
        }

        $this->client = new WebSocketClient($this->host, $this->port);
    }

    public function start(Callable $callback)
    {
        $this->client->upgrade("/?" . $this->query, $callback);
    }

    public function __set($field, $value)
    {
        if (in_array($field, $this->allow_events) && is_callable($value)) {
            $this->client->on(strtolower(substr($field, 2)), $value);
        } else {
            echo "Unsupport Event";
        }        
    }
}

onMessage = function($client, $frame) {
    list("command" => $command, "params" => $params) = parseCommand($frame->data);

    echo $command;

    switch ($command) {
        case "update":
            updateCommand();
            break;
    }
};

$ws->onClose = function($client) {

};

$ws->start(function ($client) {
    
});

SwooleProcess::daemon();



    
    Document


    

    

完整代码:

https://gitee.com/shuizhuyu/P...

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

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

相关文章

  • Swoole源码研究】浅析swoole中server的实现

    摘要:的部分是基于以及协议的。例如父进程向中写入子进程从中读取子进程向中写入父进程从中读取。默认使用对进程进行分配交给对应的线程进行监听线程收到某个进程的数据后会进行处理值得注意的是这个线程可能并不是发送请求的那个线程。 作者:施洪宝 一. 基础知识 1.1 swoole swoole是面向生产环境的php异步网络通信引擎, php开发人员可以利用swoole开发出高性能的server服务。...

    rainyang 评论0 收藏0
  • 了解swoole运行模式,加速laravel应用

    摘要:负责解释执行文件生成响应,最终返回给,展现至前端。相比于传统架构,进程模型最大的特点在于其多线程模式处理网络请求,使得其能轻松应对大量连接。这要求开发人员对于多进程的运行模式有更清晰的认识更容易内存泄露。 一、SwooleSwoole号称重新定义了PHP,它是一个PHP扩展,使得PHP可以使用异步的方式执行,就像node一样,而且还能使用socket,为PHP提供了一系列异步IO、事件...

    时飞 评论0 收藏0
  • swoole 服务端120行代码构建一个websocket 聊天室.

    摘要:的异步并行高性能网络通信引擎,使用纯语言编写,提供了语言的异步多线程服务器,异步网络客户端,异步,异步,数据库连接池,,消息队列,毫秒定时器,异步文件读写,异步查询。内置了服务器端客户端服务器端。 swoole :http://www.swoole.com/PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步M...

    韩冰 评论0 收藏0
  • Swoft 源码剖析 - Swoole和Swoft的那些事 (Http/Rpc服务篇)

    摘要:和服务关系最密切的进程是中的进程组,绝大部分业务处理都在该进程中进行。随后触发一个事件各组件通过该事件进行配置文件加载路由注册。事件每个请求到来时仅仅会触发事件。服务器生命周期和服务基本一致,详情参考源码剖析功能实现 作者:bromine链接:https://www.jianshu.com/p/4c0...來源:简书著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版。S...

    张汉庆 评论0 收藏0

发表评论

0条评论

Pines_Cheng

|高级讲师

TA的文章

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