摘要:一個小型網站的架構,前面一臺負載均衡后面幾臺服務器更新代碼成了難題一個一個傳不現實而且容易漏傳,導致兩個服務器的代碼都不一致一個簡單的想法利用發送更新指令接收到更新指令運行更新代碼有幾個角色接收命令不能發送命令發送命令流程圖部分代碼實現
一個小型網站的架構, 前面一臺負載均衡, 后面幾臺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...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/28869.html
摘要:的部分是基于以及協議的。例如父進程向中寫入子進程從中讀取子進程向中寫入父進程從中讀取。默認使用對進程進行分配交給對應的線程進行監聽線程收到某個進程的數據后會進行處理值得注意的是這個線程可能并不是發送請求的那個線程。 作者:施洪寶 一. 基礎知識 1.1 swoole swoole是面向生產環境的php異步網絡通信引擎, php開發人員可以利用swoole開發出高性能的server服務。...
摘要:負責解釋執行文件生成響應,最終返回給,展現至前端。相比于傳統架構,進程模型最大的特點在于其多線程模式處理網絡請求,使得其能輕松應對大量連接。這要求開發人員對于多進程的運行模式有更清晰的認識更容易內存泄露。 一、SwooleSwoole號稱重新定義了PHP,它是一個PHP擴展,使得PHP可以使用異步的方式執行,就像node一樣,而且還能使用socket,為PHP提供了一系列異步IO、事件...
摘要:的異步并行高性能網絡通信引擎,使用純語言編寫,提供了語言的異步多線程服務器,異步網絡客戶端,異步,異步,數據庫連接池,,消息隊列,毫秒定時器,異步文件讀寫,異步查詢。內置了服務器端客戶端服務器端。 swoole :http://www.swoole.com/PHP的異步、并行、高性能網絡通信引擎,使用純C語言編寫,提供了PHP語言的異步多線程服務器,異步TCP/UDP網絡客戶端,異步M...
摘要:和服務關系最密切的進程是中的進程組,絕大部分業務處理都在該進程中進行。隨后觸發一個事件各組件通過該事件進行配置文件加載路由注冊。事件每個請求到來時僅僅會觸發事件。服務器生命周期和服務基本一致,詳情參考源碼剖析功能實現 作者:bromine鏈接:https://www.jianshu.com/p/4c0...來源:簡書著作權歸作者所有,本文已獲得作者授權轉載,并對原文進行了重新的排版。S...
閱讀 3727·2021-10-11 10:59
閱讀 1314·2019-08-30 15:44
閱讀 3486·2019-08-29 16:39
閱讀 2894·2019-08-29 16:29
閱讀 1807·2019-08-29 15:24
閱讀 814·2019-08-29 15:05
閱讀 1270·2019-08-29 12:34
閱讀 2336·2019-08-29 12:19