Home  >  Article  >  Backend Development  >  Use Swoole to update the code of multiple servers at the same time

Use Swoole to update the code of multiple servers at the same time

不言
不言Original
2018-07-06 16:47:462199browse

This article mainly introduces the code about using Swoole to update multiple servers at the same time. It has certain reference value. Now I share it with you. Friends in need can refer to

The architecture of a small website. There is a load balancer in the front and several web servers in the back. Updating the code has become a problem. It is unrealistic to transfer one FTP one by one, and it is easy to miss the transfer, resulting in the code of the two WEB servers being inconsistent.

A simple idea :

Use Websocket Server to send update instructions, Websocket Client receives the update instructions, and runs git pull to update the code.

WebSocket Client has several roles:

  • Solider: Receive command, cannot send command

  • Commander: Send command

Flow chart:

Use Swoole to update the code of multiple servers at the same time

Partial code implementation:

<?php 
//Server.php
require_once &#39;./Table.php&#39;;

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[&#39;host&#39;], $config[&#39;port&#39;]);
        $this->server->set($config[&#39;configuration&#39;]);
        $this->addEventListener();
    }

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

    private function onOpen($server, $request)
    {
        if ($request->get[&#39;role&#39;] == &#39;commander&#39;) {
            $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([
    &#39;host&#39; => &#39;0.0.0.0&#39;,
    &#39;port&#39; => 8015,
    &#39;configuration&#39; => [
        &#39;daemonize&#39; => 1,
    ]
]);

$server->run();
<?php 
//Client.php
use Swoole\Http\Client as WebSocketClient;

class Client
{
    protected $protocol;

    protected $host;

    protected $port;

    protected $query;

    protected $client;

    protected $allow_events = [&#39;onOpen&#39;, &#39;onMessage&#39;, &#39;onClose&#39;];

    public function __construct($url)
    {
        list(&#39;scheme&#39; => $this->protocol, &#39;host&#39; => $this->host, &#39;port&#39; => $this->port, &#39;query&#39; => $this->query) = parse_url($url);

        if ($this->protocol == &#39;wss&#39;) {
            echo &#39;unsupport protocol&#39;;
        }

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

    public function start(Callable $callback)
    {
        $this->client->upgrade(&#39;/?&#39; . $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 &#39;Unsupport Event&#39;;
        }        
    }
}
<?php 
//Solider.php
require_once &#39;./Client.php&#39;;

function parseCommand($data)
{
    return json_decode($data, true);
}

function updateCommand()
{
    //you can do something here
    exec(&#39;git pull&#39;);
    // exec(&#39;composer update&#39;);
    // exec(&#39;npm install&#39;);
}

$ws = new Client(&#39;ws://192.168.1.142:8015?role=solider&#39;);

$ws->onMessage = function($client, $frame) {
    list(&#39;command&#39; => $command, &#39;params&#39; => $params) = parseCommand($frame->data);

    echo $command;

    switch ($command) {
        case &#39;update&#39;:
            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>

Full code:

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

The above is the entire content of this article. I hope it will be helpful to everyone's study. For more related content, please pay attention to the PHP Chinese website!

Related recommendations:

Enable shmop extension for PHP to implement shared memory

Use RoadRunner to accelerate Laravel applications

Use mixphp to create multi-process asynchronous email sending

The above is the detailed content of Use Swoole to update the code of multiple servers at the same time. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn