利用Swoole同時更新多台伺服器的代碼

來源:互聯網
上載者:User
這篇文章主要介紹了關於利用Swoole同時更新多台伺服器的代碼,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

一個小型網站的架構, 前面一台負載平衡, 後面幾台web伺服器. 更新代碼成了難題, 一個一個FTP傳不現實, 而且容易漏傳,導致兩個WEB伺服器的代碼都不一致.

一個簡單的想法:

利用Websocket Server發送更新指令, Websocket Client 接收到更新指令, 運行git pull更新代碼.

WebSocket Client有幾個角色:

  • Solider: 接收命令, 不能發送命令

  • Commander: 發送命令

流程圖:

部分代碼實現:

<?php //Server.phprequire_once './Table.php';use Swoole\WebSocket\Server as WebSocketServer;class Server{    protected $server;    protected $table;    public function __construct($config)    {        $this->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();
<?php //Client.phpuse Swoole\Http\Client as WebSocketClient;class Client{    protected $protocol;    protected $host;    protected $port;    protected $query;    protected $client;    protected $allow_events = ['onOpen', 'onMessage', 'onClose'];    public function __construct($url)    {        list('scheme' => $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';        }            }}
<?php //Solider.phprequire_once './Client.php';function parseCommand($data){    return json_decode($data, true);}function updateCommand(){    //you can do something here    exec('git pull');    // exec('composer update');    // exec('npm install');}$ws = new Client('ws://192.168.1.142:8015?role=solider');$ws->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) {    });\Swoole\Process::daemon();
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Document</title></head><body>    <button class="btn btn-primary" onclick="update();">更新</button>    <script type="text/javascript">        function update()        {            var ws = new WebSocket("ws://192.168.1.142:8015?role=commander");                           ws.onopen = function()           {              // Web Socket 已串連上,使用 send() 方法發送資料              ws.send(JSON.stringify({"command": "update", "params": {}}));           };                       ws.onmessage = function (evt)            {               var received_msg = evt.data;              alert(received_msg);           };                       ws.onclose = function()           {               // 關閉 websocket              alert("串連已關閉...");            };        }    </script></body></html>

完整代碼:

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

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.