利用Swoole同时更新多台服务器的代码

利用Swoole同时更新多台服务器的代码

内容导读

收集整理的这篇技术教程文章主要介绍了利用Swoole同时更新多台服务器的代码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4106字,纯文字阅读大概需要6分钟

内容图文

这篇文章主要介绍了关于利用Swoole同时更新多台服务器的代码,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

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

一个简单的想法:

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

WebSocket Client有几个角色:

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

  • Commander: 发送命令

流程图:

部分代码实现:

<?php //Server.phprequire_once './Table.php';use SwooleWebSocketServer 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 SwooleHttpClient 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) {

});SwooleProcess::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中文网!

相关推荐:

给PHP开启shmop扩展实现共享内存

使用RoadRunner 加速 Laravel 应用

使用 mixphp 打造多进程异步邮件发送

以上就是利用Swoole同时更新多台服务器的代码的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的利用Swoole同时更新多台服务器的代码全部内容,希望文章能够帮你解决利用Swoole同时更新多台服务器的代码所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com