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 数据的软件,其接收用户的下载申请,并自 ...
随机推荐
- stm32的FSMC
之前用的stm32f103rbt6,它是100引脚以内的,不带FSMC.驱动液晶屏或者SRAM要自己写时序方面的程序,比较麻烦.后来换成stm32f103zet6,带有FSMC.不过在学习FSMC的时 ...
- HttpAsyncClient 的简单使用
下载地址:http://hc.apache.org/downloads.cgi 在NetBeans中导入以下jar文件: 1:一次请求: public static void oneReuest(){ ...
- Seafile的手册
http://manual.seafile.com/http://manual-cn.seafile.com/deploy/using_mysql.html 中文版http://manual-cn.s ...
- poj1703--Find them, Catch them(并查集应用)
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32073 Accepted: ...
- scrapy使用crontab定时任务不能自动执行的调试
在用crontab进行定时任务时,发现任务并没有执行.而手动bash yourshell.sh时可以正常的执行程序.以下是个人的解决流程. 一.将错误打印打out.log */10 * * * * b ...
- mysql免安装版配置与使用方法
mysql免安装版配置与使用方法 以mysql-noinstall-5.1.6(win32)为例 1>把压缩文件mysql-noinstall-5.1.6-alpha-win32.zi ...
- js获取url参数的方法
js获取url参数的方法有很多. 1.正则分析 function getQueryString(name) { var reg = new RegExp("(^|&)" + ...
- Android系统,动态找出一个包下所有的类
最近在写一个android应用,由于针对不同机型功能很不同,为了隔离变化,希望将各项功能插件化,通过编译开关来控制不同版本的功能,而不是在代码中通过逻辑来判断. 我想了一个办法,用表驱动的方法,结合插 ...
- PHP学习笔记三十三【自定义错误处理器】
<?php //自定义错误处理器 //$errorno 错误号 //$errmes错误信息 //这两个参数是必须的 function my_error($errorno,$errmes) { e ...
- pca图像识别
代码下载:基于PCA(主成分分析)的人脸识别 人脸识别是一个有监督学习过程,首先利用训练集构造一个人脸模型,然后将测试集与训练集进行匹配,找到与之对应的训练集头像.最容易的方式是直接利用欧式距离计算测 ...