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

一个简单的想法:

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

WebSocket Client有几个角色:

  • 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 hereexec('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(){ // 关闭 websocketalert("连接已关闭..."); };}</script>
</body>
</html>

完整代码:

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

利用Swoole同时更新多台服务器代码相关推荐

  1. weblogic集群部署与负载均衡_集群,负载均衡,分布式的讲解和多台服务器代码同步...

    集群 我们的项目如果跑在一台机器上,如果这台机器出现故障的话,或者用户请求量比较高,一台机器支撑不住的话.我们的网站可能就访问不了.那怎么解决呢?就需要使用多台机器,部署一样的程序,让几个机器同时的运 ...

  2. Ubuntu系统,window系统,利用闲置电脑搭建了一台服务器

    折腾了一天,不对,不止一天,顺便做个小笔记分享大家,希望大家可以用到----- 两条电脑(一台用作服务器,安装Linux系统:另一台就是win系统的) 注册zerotier官网账号https://ww ...

  3. websocket 更新点位 浏览器卡顿_我们来看看Swoole是如何实现WebSocket服务器及客户端的...

    php自学中心 2019-11-08 10:25:30 文章来自:laravel学院WebSocket 概述 在此之前,有必要对 WebSocket 的原理做简单的说明,WebSocket 复用了 H ...

  4. WSUS补丁服务器部署详细 利用WSUS部署更新程序

    WSUS补丁服务器部署详细 利用WSUS部署更新程序 https://www.cnblogs.com/Summer6/p/10921491.html WSUS概述 为了让用户的windows系统与其他 ...

  5. linux脚本实现复制,Shell脚本实现复制文件到多台服务器的代码分享

    在多机集群环境中,经常面临修改配置文件后拷贝到多台服务器的情况,传统的执行scp比较麻烦,所以写了以下shell脚本,可以将指定文件拷贝到多台机器. 使用方法请参见HELP部分代码. #!/bin/b ...

  6. 两台linux服务器负载均衡代码实现,nginx实现负载均衡,nginx负载均衡确保两台服务器数据保...

    nginx实现负载均衡,nginx负载均衡确保两台服务器数据保 一.准备篇: Nginx 负载服务器: Centos 6.2 IP:192.168.1.93 WEB服务器: Web1:192.168. ...

  7. php实现笔记共享,[转载]利用memcached在多台服务器之间共享PHP的session数据

    最近我的几篇文章都是是最近项目的一点心得^^ 这个项目一开始就设计的"很大",考虑了很多负载均衡方面的东西,比如采用nginx将php的请求分摊到若干个运行php fastcgi的 ...

  8. Java游戏服务器代码热更新

    一般碰到这个问题首先想到的解决方案都是考虑new 一个classLoader来加载新的类,这样的解决方式有什么优点和缺点呢. 使用ClassLoader的方式加载类就涉及到一些需要知道的知识点.双亲委 ...

  9. linux更新代码脚本,更新本地代码到服务器的shell脚本

    更新本地代码到服务器的shell脚本 用Ubuntu做开发机OS遇到的第一个问题就是将更新的代码放上测试服务器运行 www.ahlinux.com 之前用windows的时候是用Winscp更新代码到 ...

最新文章

  1. 【Python】实现将testlink上的用例指定格式保存至Excel,用于修改上传
  2. 物理主机安装linux的方法
  3. vba传值调用_小白关于VBA调用Sub传递参数之传值与传址的思考
  4. Swift 4正式发布,新功能概览
  5. 用c语言编写一个2048 游戏,求c语言编写的2048游戏代码,尽量功能完善一些
  6. CATIA中使用约束时提示“创建的约束是临时的。若希望使他成为永久约束,则需要在单击确定按钮之前激活约束开关。”
  7. 为何高于四次的方程没有根式解?
  8. http抓包实战 pdf_抓包实战 | 浏览器里的HTTP请求到底是如何完成的?
  9. 【深度学习原理】交叉熵损失函数的实现
  10. Windows+Ubuntu双系统如何彻底删除Ubuntu操作系统
  11. 详解ASIC设计流程
  12. foo, bar, 甲乙丙丁
  13. 零基础无经验,该怎么学编程,要学多久?
  14. 骨传导耳机是利用什么原理听歌?什么骨传导耳机好用
  15. win10 1809无法更新(扩展EFI分区)
  16. linux终端用什么颜色好,linux 终端输出颜色
  17. 分布式事务解决方案之最大努力通知 上篇
  18. matlab 矩阵大小变换,matlab 矩阵变换
  19. svn 代码迁移到git
  20. FileUriExposedException: file:///storage/emulated/0/Android/data/com.skyrin.bingo/cache/app/app.apk

热门文章

  1. 阿里巴巴宣布成立人工智能治理与可持续发展实验室
  2. “上海名媛群”事件,我来说几句
  3. 美国医疗机构是如何应用和看待「新冠AI」的?
  4. 微软新作,ImageBERT虽好,千万级数据集才是亮点
  5. AI项目成功的4要素
  6. 3 年血亏 10 亿美元,Google Deepmind 出了什么问题?
  7. 无所不答的“自动聊天AI”
  8. python检查URL是否能正常访问
  9. SAP WM 自动创建TO单的JOB运行报错 - Enter the storage unit type - 对策
  10. SAP MM 工序委外场景再探 – 相关采购申请单据中的总账科目确定