零配置自组网怎么做?swoole6

发布时间:2026/6/13 20:11:56

零配置自组网怎么做?swoole6 零配置自组网怎么做swoole6 ●核心就四件事:发现 → 心跳 → 哈希 → 派活。零配不写 IP,靠局域网 UDP 广播互相找到。Swoole6全有现成料。下面是能跑的单文件,起两份就自动成集群:?php// cluster.php —— Swoole 6 零配置自组网,直接 php cluster.php 起多份use Swoole\Coroutine;use Swoole\Timer;use Swoole\Coroutine\Server;use Swoole\Coroutine\Client;use function Swoole\Coroutine\run;$ME127.0.0.1:.(getenv(PORT)?:9501);// 唯一标识自己IP:端口$members[$MEtime()];// 成员表:节点→最后心跳时间run(function()use($ME,$members){// 1. 任务服务:别人派活/广播心跳都打到这,TCP收Coroutine::create(function()use($ME,$members){$snewServer(127.0.0.1,(int)explode(:,$ME)[1],false);$s-handle(function($conn)use($members,$ME){$msgjson_decode($conn-recv(),true);if($msg[t]ping){foreach($msg[m]as $n)$members[$n]time();$conn-send(ok);}//收心跳→并成员if($msg[t]job){$conn-send(json_encode([by$ME,rstrrev($msg[d])]));}//收任务→干});$s-start();});// 2. 心跳发现:每秒把我知道的所有节点广播给所有节点(gossip),3秒没消息就剔除Timer::tick(1000,function()use($ME,$members){foreach(range(9501,9510)as $p){// 端口段零配置发现,无需写IP$peer127.0.0.1:$p;if($peer$ME)continue;$cnewClient(SWOOLE_TCP);if($c-connect(127.0.0.1,$p,0.2)){$c-send(json_encode([tping,marray_keys($members)]));$members[$peer]time();$c-close();}}foreach($members as $n$t)if(time()-$t3$n!$ME)unset($members[$n]);// 超时剔除echo[$ME] 活着的节点: .implode(,,array_keys($members)).\n;});});大白话怎么跑:开三个终端 PORT9501php cluster.php、9502、9503。它们各自往9501-9510端口段试连,连上就互相告诉我认识谁,几秒内三方成员表自动一致——没写一个IP,自动成集群。 四步原理:-发现:扫端口段(局域网换成 UDP 广播255.255.255.255更优雅,免端口列表)。-心跳:每秒 gossip 一次成员表,谁掉线3秒内全员剔除,无中心。-派活:hash(key)%节点数 选 owner,TCP 把任务打过去(上面 job 那段)。-复用:换6.x 的 Thread\Map 存 $members,多线程共享更稳。 一句话:成员表每秒互传一致性哈希,就是自组网的全部。

相关新闻