We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
//权重轮询调度算法类http://www.36nu.com/post/145.html 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]; } } }
}
//测试代码 $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'].''; 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.''; echo 'B:'.$b.''; echo 'C:'.$c.''; echo 'D:'.$d.''; echo 'E:'.$e.'';
The text was updated successfully, but these errors were encountered:
No branches or pull requests
//权重轮询调度算法类http://www.36nu.com/post/145.html
class WeightedRoundRobin
{
private static $_weightArray = array();
}
//测试代码
$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'].'
';
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.'
';
echo 'B:'.$b.'
';
echo 'C:'.$c.'
';
echo 'D:'.$d.'
';
echo 'E:'.$e.'
';
The text was updated successfully, but these errors were encountered: