程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> rrd.so更新導致rrd_fetch返回值變更,與舊版不兼容

rrd.so更新導致rrd_fetch返回值變更,與舊版不兼容

編輯:關於PHP編程

前兩天把php的rrd extension從舊版本的rrdtool.so升級到了最新的rrd.so


但是使用時發現很多函數的調用方式都變了,主要是都取消了count($opts)的配置,比如rrd_create、rrd_fetch、rrd_update等函數
原本都是( string $filename , array $options , count($opts))三個參數,現在都簡化成了( string $filename , array $options)兩個參數


但頭疼的是rrd_fetch這個函數的返回值格式整體都變掉了,導致和已有的代碼完全不一樣。
新的rrd.so中,rrd_fetch返回值:
[php]
array(4) { 
  ["start"]=> 
  int(1341834300) 
  ["end"]=> 
  int(1341834600) 
  ["step"]=> 
  int(300) 
  ["data"]=> 
  array(2) { 
    ["ds0"]=> 
    array(1) { 
      [1341834600]=> 
      float(29875732.323333) 
    } 
    ["ds1"]=> 
    array(1) { 
      [1341834600]=> 
      float(139478395.26667) 
    } 
  } 

 

 

舊的rrdtool.so中,rrd_fetch返回值:
[php]
array(6) { 
  ["start"]=> 
  int(1341834300) 
  ["end"]=> 
  int(1341834600) 
  ["step"]=> 
  int(300) 
  ["ds_cnt"]=> 
  int(2) 
  ["ds_namv"]=> 
  array(2) { 
    [0]=> 
    string(3) "ds0" 
    [1]=> 
    string(3) "ds1" 
  } 
  ["data"]=> 
  array(2) { 
    [0]=> 
    float(1073.00666667) 
    [1]=> 
    float(32.9566666667) 
  } 

[php]
[2011-03-02 04:26 UTC] koubel at seznam dot cz 
thank you, rrd_fetch rewritten, there were a bug in filling the returned array. Nowadays all data sources are supported (trunk code). I made a litte bit BC break, no more ds_cnt, ds_namv keys in result array from fetch. I think these are completely useless. 

 
大神覺得ds_cnt、ds_namv這兩個參數完全沒用,並且還修改了data的返回格式


好吧,新的rrd_fetch確實挺簡單,而且還有了數據對應的時間,非常方便,但是過渡階段怎麼辦呢?原始系統沒辦法瞬間改完,但後台rrd已經升級完了,沒辦法,只好先搞個臨時解決方案


[php] 
#舊版本的rrd_fetch返回格式與新版本不同,過渡階段需要用下面的函數將新版本rrd_fetch的返回值,改成舊版本的格式,才能兼容舊版本代碼 
function my_rrd_fetch($file_path, $opts , $count = 0) { 
    $ret = rrd_fetch($file_path, $opts); 
    if(!$ret) 
        return false; 
 
 
    $start = $ret['start']; 
    $end = $ret['end']; 
    $step = $ret['step']; 
    $ds_cnt = 0; 
    $ds_namv = array(); 
    $data = array(); 
    $tmpdata = array(); 
    foreach($ret['data'] as $key => $values) { 
        $ds_namv[] = $key; 
        $ds_cnt++; 
        foreach($values as $time => $value) { 
            $tmpdata[] = $value;             
        }  www.2cto.com
    } 
 
 
    $count = count($tmpdata); 
    for($i = 0; $i < ($count/2); $i++){ 
        $data[] = $tmpdata[$i]; 
        $data[] = $tmpdata[$i + ($count/2)]; 
    } 
 
 
    return array('start' => $start, 'end' => $end, 'step' => $step, 'ds_cnt' => $ds_cnt, 'ds_namv' => $ds_namv, 'data' => $data); 

 

用上面的my_rrd_fetch來替換以前的rrd_fetch,功能就是將新版的rrd_fetch的返回值改成舊版的返回,用於臨時兼容舊版本代碼...


當然後期還是要慢慢的都改成新函數才可以...
作者:Liv2005

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved