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版权重轮询调度算法的更多相关文章

  1. 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现2

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 与上一遍博客 http://www.cnblogs.com/hu ...

  2. 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3 之前两篇相关博文: 权重轮询调度算法(WeightedRound-RobinScheduling)-Ja ...

  3. 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 import java.math.BigInteger; import java.util.ArrayLi ...

  4. 权重轮询调度算法 java版本号

    权重轮询调度算法(Weighted Round-Robin Scheduling)--java版本号 因为每台server的配置.安装的业务应用等不同.其处理能力会不一样.所以,我们依据server的 ...

  5. 权重轮询调度算法(WeightedRound-RobinScheduling)

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 这里主要参考这篇文章的实现: Nginx 负载均衡-加权轮询策略 ...

  6. 权重轮询调度算法(Weighted Round-Robin Scheduling)-C#实现

    在多台机器实现负载均衡的时候,存在调度分配的问题. 如果服务器的配置的处理能力都一致的话,平均轮询分配可以直接解决问题,然而有些时候机器的处理能力是不一致的. 假如有2台机器 A和B , A的处理能力 ...

  7. golang实现权重轮询调度算法

    package main import ( "fmt" "time" ) var slaveDns = map[int]map[string]interface ...

  8. 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#

    负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...

  9. Apache的代理服务器的配置 (正向代理 ,反向代理,轮询调度)

    一. 代理服务器的了解1.代理服务器 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息. Squid是一个缓存Internet 数据的软件,其接收用户的下载申请,并自 ...

随机推荐

  1. VS2010下测试程序性能瓶颈

    之前看到Qt的有个BUGreport https://bugreports.qt-project.org/browse/QTBUG-13182 这个BUG是在windows下QFileDialog很慢 ...

  2. 关于BitmapFactory.decodeStream(is)方法无法正常解码为Bitmap对象的解决方法

    在android sdk 1.6版本API帮助文档中,其中关于BitmapFactory.decodeFactory.decodeStream(InputStream is)的帮助文档是这么说明的: ...

  3. Linux CPU 亲和性

    在Linux中,我们知道可以通过nice.renice命令改变进程的执行优先级,优先级高的进程优先执行,从而一定程度上保证重要任务的运行. 除了nice.renice外,可以通过CPU affinit ...

  4. 【转】基于DM8168的视频智能分析系统的设计方案

        [导读] 为了实现高清视频的智能分析功能,本文介绍了一种以TI公司的DM8168为核心的高清视频智能分析系统的设计方案,该方案从硬件设计和软件设计两个方面介绍了硬件组成.工作流程.软件架构,并 ...

  5. ajax的封装

    ajax是前端工程中与后台进行数据交互的一门重要技术,通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.jquer ...

  6. Java里多个Map的性能比較(TreeMap、HashMap、ConcurrentSkipListMap)

    问题 比較Java原生的 1.  TreeMap 2.  HashMap 3.  ConcurrentSkipListMap 3种Map的效率. 结果 模拟150W以内海量数据的插入和查找,通过添加和 ...

  7. [重磅] 让HTML5达到原生的体验 系列之中的一个 避免切页白屏

    非常多人都想.甚至曾使用HTML5开发跨平台App.而且想达到原生App的体验. 最后的结果都是无奈的放弃.HTML5貌似美好,但坑太多.想做到原生App的体验差点儿不可为. 也曾有过著名的faceb ...

  8. Udacity调试课笔记之断言异常

    Udacity调试课笔记之断言异常 这一单元的内容不是很多,如Zeller教授所说,就是如何写.检查断言,并如何使用工具实现自动推导出断言的条件. 现在,多数的编程语言,尤其是高级编程语言都会有内置的 ...

  9. [Hapi.js] Logging with good and good-console

    hapi doesn't ship with logging support baked in. Luckily, hapi's rich plugin ecosystem includes ever ...

  10. Android开发记录(转)

    一.Android模拟器相关 1. Android模拟器安装 Market 模拟器默认没有安装 Market,看到网上有较为复杂的安装方法,也有1个简单的,试了简单的,在 Android2.2 模拟器 ...