php方案 PHP实现负载均衡客户端

发布时间:2026/5/20 23:03:41

php方案 PHP实现负载均衡客户端 ?php// 轮询挨个来classRoundRobin{privateint$i0;publicfunction__construct(privatearray$servers){}publicfunctionpick():string{return$this-servers[$this-i%count($this-servers)];}}// 加权轮询权重高的多接活classWeightedRoundRobin{privatearray$pool[];privateint$i0;publicfunction__construct(array$servers){// $servers [[host10.0.0.1, weight3], ...]foreach($serversas$s)for($j0;$j$s[weight];$j)$this-pool[]$s[host];}publicfunctionpick():string{return$this-pool[$this-i%count($this-pool)];}}// 随机functionrandom_pick(array$servers):string{return$servers[array_rand($servers)];}// 最少连接谁闲给谁classLeastConn{privatearray$conns;publicfunction__construct(privatearray$servers){$this-connsarray_fill_keys($servers,0);}publicfunctionpick():string{asort($this-conns);$sarray_key_first($this-conns);$this-conns[$s];return$s;}publicfunctiondone(string$s):void{$this-conns[$s]--;}}// IP Hash同一个客户端永远打到同一台会话保持functionip_hash(string$clientIp,array$servers):string{return$servers[crc32($clientIp)%count($servers)];}实际用起来$servers[10.0.0.1:8080,10.0.0.2:8080,10.0.0.3:8080];// 轮询$rrnewRoundRobin($servers);$httpnewGuzzleHttp\Client();$res$http-get(http://.$rr-pick()./api/data);// 加权第一台性能强多给它$wrrnewWeightedRoundRobin([[host10.0.0.1:8080,weight3],[host10.0.0.2:8080,weight1],[host10.0.0.3:8080,weight1],]);// 最少连接$lcnewLeastConn($servers);$server$lc-pick();$res$http-get(http://.$server./api/data);$lc-done($server);// 请求完了记得释放FPM多进程下的问题 上面的$i是进程内存每个FPMworker 各自计数轮询会乱。跨进程共享状态要用 Redis$redisnewRedis();$redis-connect(127.0.0.1);functionrr_redis(array$servers,Redis$redis):string{$i$redis-incr(lb:rr)-1;return$servers[$i%count($servers)];}---选哪个算法无状态服务用轮询机器性能不一样用加权有登录态用IPHash后端响应时间差异大用最少连接。

相关新闻