首页 > 代码库 > PHP 多维数组的排序----服务器负载均衡的应用

PHP 多维数组的排序----服务器负载均衡的应用

        array_multisort 在php 中该函数实现多维数组的排序功能,在呼叫中心或者计费服务器中,或许我们需要实现多台服务器按权重(百分比)的模式进行对语音进行分发,那么该函数将帮助你实现该需求。

       实例中core_callback_setting 将会保存可以使用的服务器的配置信息:

id---字段ID,也是服务器的ID标记

,ast_ob_servername ---服务器的名字标识,

,ast_ob_host-----服务器IP地址

,ast_ob_port-----AMI 服务器端口

,ast_ob_user-----AMI 服务器验证用户名

,ast_ob_pwd-------AMI 服务器验证密码

,percent_rate-----服务器权重

,current_threads----服务器当前并发

,max_threads-------服务器最大并发

,last_dispatch_time---最近一次分发到该服务器的时间

,ast_version-------软交换的版本


下面将是具体实现的逻辑函数

//function get cb server
function get_callback_srv()
{
  global $conn;
  $cb_srv_ary=array();
  $srv_tmp_ary1=array();
  $srv_tmp_ary2=array();
  
  $sql="SELECT id,ast_ob_servername,ast_ob_host,ast_ob_port,ast_ob_user,ast_ob_pwd,percent_rate,current_threads,max_threads,last_dispatch_time,ast_version FROM core_callback_setting WHERE state AND percent_rate";
  #echo $sql,"\n";
  $rslt=mysql_query($sql,$conn);
  $rcnt=mysql_num_rows($rslt);
  if($rcnt>0)
    {
      if($rcnt ==1)
         {
           #echo "目前只有一个服务器满足要求.....\n";
           $cb_srv_ary=mysql_fetch_assoc($rslt);
         }
      else
      {
       for($j=0;$j<$rcnt;$j++)
         {
          $row=mysql_fetch_assoc($rslt);
          $srv_id=$row[‘id‘];
          $srv_tmp_ary1[$srv_id]=$row;
          $r_rate=round($row[‘current_threads‘]/$row[‘percent_rate‘],4);
          $srv_tmp_ary2[]=array(‘srv_id‘=> $row[‘id‘],
                             ‘last_dispatch_time‘ => $row[‘last_dispatch_time‘],
                             ‘r_rate‘=> $r_rate);
         }
         ##获取记录后,对记录进行排序
         foreach($srv_tmp_ary2 as $key => $row)
             {
               $val1[$key]=$row[‘r_rate‘];
               $val2[$key]=$row[‘last_dispatch_time‘];
             }
          ##数组排序
          array_multisort($val1,SORT_ASC,$val2,SORT_ASC,$srv_tmp_ary2);
          #print_r($srv_tmp_ary2);
          ##获取第一个
          #echo ">>>>>>>>>>>>>>>>>>>>>>>>\n";
          $srv_id=$srv_tmp_ary2[0][‘srv_id‘];
          #print_r($srv_tmp_ary1[$srv_id]);
          $cb_srv_ary=$srv_tmp_ary1[$srv_id];
          
      }
      
    }
    else
    {
      writelog($sql);
    }
    return $cb_srv_ary;
}


本文出自 “asterisk系统专栏” 博客,谢绝转载!