php版权重轮询调度算法
2013-09-25 16:17
232 查看
2013-09-25
客户端代码:在thinkphp中实现
测试结果:
<?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(); } }
测试结果:
相关文章推荐
- 抢占式任务调度和非抢占式(轮询任务调度)的区别,以及任务调度算法的用途。
- 负载均衡之权重轮询调度算法
- 部署Nginx反向代理三个web服务并调度算法使用加权轮询
- PHP数据结构与算法:栈
- php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
- 在PHP中使用协程实现多任务调度
- php 常用算法和时间复杂度
- 进程调度的典型算法
- rt-thread的位图调度算法分析
- php字符串常用算法--字符串加密解密
- PHP之算法
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍
- PHP抽奖程序概率算法
- 微博短链接算法php版本实现代码
- 短进程优先的调度算法详解
- 浅析lvs的十种负载调度算法
- 五种进程调度的算法实现(二)
- [算法也疯狂]实现假装商品抢购繁忙的效果(php版)
- 常见的进程优先调度算法
- QQ群红包的算法实现探讨(基于PHP demo)