php版权重轮询调度算法
2013-09-25
<?php
class WeightedRoundRobin
{
private static $_weightArray = array(); private static $_i = -1;//代表上一次选择的服务器
private static $_gcd;//表示集合S中所有服务器权值的最大公约数
private static $_cw = 0;//当前调度的权值
private static $_max;
private static $_n;//agent个数 public function __construct(array $weightArray)
{
self::$_weightArray = $weightArray;
self::$_gcd = self::getGcd(self::$_weightArray);
self::$_max = self::getMaxWeight(self::$_weightArray);
self::$_n = count($weightArray);
} private static function getGcd(array $weightArray)
{
$temp = array_shift($weightArray);
$min = $temp['weight'];
$status = false;
foreach ($weightArray as $val) {
$min = min($val['weight'],$min);
} if($min == 1){
return 1;
}else{
for ($i = $min; $i>1; $i--) {
foreach ($weightArray as $val) {
if (is_int($val['weight']/$i)) {
$status = true;
}else{
$status = false;
break;
}
}
if ($status) {
return $i;
}else {
return 1;
}
}
}
}
private static function getMaxWeight(array $weightArray)
{
if(empty($weightArray)){
return false;
}
$temp = array_shift($weightArray);
$max = $temp['weight'];
foreach ($weightArray as $val) {
$max = max($val['weight'],$max);
}
return $max;
}
public function getWeight()
{
while (true){
self::$_i = ((int)self::$_i+1) % (int)self::$_n;
if (self::$_i == 0) {
self::$_cw = (int)self::$_cw - (int)self::$_gcd;
if (self::$_cw <= 0) {
self::$_cw = (int)self::$_max;
if (self::$_cw == 0) {
return null;
}
}
}
if ((int)(self::$_weightArray[self::$_i]['weight']) >= self::$_cw) {
return self::$_weightArray[self::$_i];
}
}
}
}
?>
客户端代码:在thinkphp中实现
<?php
class IndexAction extends Action {
public function index(){ import("COM.WeightedRoundRobin"); $arr = array(
array('id' => 'A', 'weight' => 3),
array('id' => 'B', 'weight' => 3),
array('id' => 'C', 'weight' => 6),
array('id' => 'D', 'weight' => 4),
array('id' => 'E', 'weight' => 1), );
$weight = new WeightedRoundRobin($arr); $a=0;
$b=0;
$c=0;
$d=0;
$e=0;
for ($j = 0; $j < 100; $j++) {
$weightInfo = $weight->getWeight();
echo $weightInfo['id'].'----------------------weight:'.$weightInfo['weight'].'<br/>';
if($weightInfo['id'] == 'A'){
$a++;
}
if($weightInfo['id'] == 'B'){
$b++;
}
if($weightInfo['id'] == 'C'){
$c++;
}
if($weightInfo['id'] == 'D'){
$d++;
}
if($weightInfo['id'] == 'E'){
$e++;
}
}
echo 'A:'.$a.'<br/>';
echo 'B:'.$b.'<br/>';
echo 'C:'.$c.'<br/>';
echo 'D:'.$d.'<br/>';
echo 'E:'.$e.'<br/>';
exit;
$this->display();
}
}
测试结果:


php版权重轮询调度算法的更多相关文章
- 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现2
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 与上一遍博客 http://www.cnblogs.com/hu ...
- 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3 之前两篇相关博文: 权重轮询调度算法(WeightedRound-RobinScheduling)-Ja ...
- 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 import java.math.BigInteger; import java.util.ArrayLi ...
- 权重轮询调度算法 java版本号
权重轮询调度算法(Weighted Round-Robin Scheduling)--java版本号 因为每台server的配置.安装的业务应用等不同.其处理能力会不一样.所以,我们依据server的 ...
- 权重轮询调度算法(WeightedRound-RobinScheduling)
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 这里主要参考这篇文章的实现: Nginx 负载均衡-加权轮询策略 ...
- 权重轮询调度算法(Weighted Round-Robin Scheduling)-C#实现
在多台机器实现负载均衡的时候,存在调度分配的问题. 如果服务器的配置的处理能力都一致的话,平均轮询分配可以直接解决问题,然而有些时候机器的处理能力是不一致的. 假如有2台机器 A和B , A的处理能力 ...
- golang实现权重轮询调度算法
package main import ( "fmt" "time" ) var slaveDns = map[int]map[string]interface ...
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...
- Apache的代理服务器的配置 (正向代理 ,反向代理,轮询调度)
一. 代理服务器的了解1.代理服务器 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息. Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自 ...
随机推荐
- 转:Reddit排名算法工作原理
http://www.aqee.net/how-reddit-ranking-algorithms-work/ 这是一篇继<Hacker News 排名算法工作原理>之后的又一篇关于排名算 ...
- C语言中的系统时间结构体类型
在C语言涉及中经常需要定时触发事件,涉及到获取系统时间,其结构体类型有多种.Unix/Linux系统下有以下几种时间结构: 1.time_t 类型:长整型,一般用来表示从1970-01-01 00:0 ...
- android中处理XML的方式
http://www.cnblogs.com/zhangdongzi/archive/2011/04/14/2016434.html 放在assets目录 http://www.cnblogs.com ...
- Linux系统监控
http://my.oschina.net/aiguozhe/blog/35730 http://my.oschina.net/aiguozhe/blog/35730
- hdu 3339 In Action
http://acm.hdu.edu.cn/showproblem.php?pid=3339 这道题就是dijkstra+01背包,先求一遍最短路,再用01背包求. #include <cstd ...
- uniq详解
一.简介 报告或删除文件中重复的行. uniq 命令读取由 InFile 参数指定的标准输入或文件.该命令首先比较相邻的行,然后除去第二行和该行的后续副本.重复的行一定相邻.(在发出 uniq 命令之 ...
- c++ 08
一.程序的错误 1.编码错误:编译阶段 2.设计错误:测试阶段 3.环境错误:使用阶段 4.应用错误:测试和使用阶段 二.错误处理机制 1.通过返回值处理错误 当一个函数在执行过程中发生了某种错误,通 ...
- CF 584B Kolya and Tanya
题目大意:3n个人围着一张桌子,给每个人发钱,可以使1块.2块.3块,第i个人的金额为Ai.若存在第个人使得Ai + Ai+n + Ai+2n != 6,则该分配方案满足条件,求所有的满足条件的方案数 ...
- hdu 5245 Joyful(期望的计算,好题)
Problem Description Sakura has a very magical tool to paint walls. One day, kAc asked Sakura to pain ...
- php 对象的一些特性
class person { private $name; private $age = 2; public function __construct($name,$age) { $this-> ...