ホームページ >バックエンド開発 >PHPチュートリアル >Swooleを使用して複数のサーバーのコードを同時に更新する
この記事では主に、Swoole を使用して複数のサーバーを同時に更新するためのコードを紹介します。これには一定の参考値があります。ここで共有します。必要な友人は参照できます。
The Architecture of a小規模な Web サイトです。フロントにロードバランサーがあり、バックに複数の Web サーバーがあります。コードの更新が問題になります。1 つの FTP を 1 つずつ転送するのは現実的ではなく、転送漏れが発生しやすくなります。 2 つの WEB サーバーのコードが矛盾しています。
簡単なアイデア:
Websocket サーバーを使用して更新指示を送信し、Websocket クライアントが更新指示を受信して、git pull
を実行します。コードを更新します。
WebSocket クライアントにはいくつかの役割があります:
Solider: コマンドを受信しますが、コマンドは送信できません
Commander : コマンドの送信
フローチャート:
コードの一部の実装:
<?php //Server.php require_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.php use 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.php require_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...
以上がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。関連コンテンツをさらにご覧になりたい場合は、お支払いください。 PHP 中国語 Web サイトに注意してください。
関連する推奨事項:
PHP の shmop 拡張機能を有効にして共有メモリを実装する
RoadRunner を使用して Laravel アプリケーションを高速化する
#mixphp を使用してマルチプロセスの非同期メール送信を作成する##
以上がSwooleを使用して複数のサーバーのコードを同時に更新するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。