rrd.so更新导致rrd_fetch返回值变更,与旧版不兼容


前两天把php的rrd extension从旧版本的rrdtool.so升级到了最新的rrd.so

附:

旧版本的rrdtool.so (php_rrdtool.tar.gz )下载地址:http://oss.oetiker.ch/rrdtool/pub/contrib/

新版本的rrd.so下载地址:http://pecl.php.net/package/rrd

但是使用时发现很多函数的调用方式都变了,主要是都取消了count($opts)的配置,比如rrd_create、rrd_fetch、rrd_update等函数

原本都是( string $filename , array $options , count($opts))三个参数,现在都简化成了( string $filename , array $options)两个参数

但头疼的是rrd_fetch这个函数的返回值格式整体都变掉了,导致和已有的代码完全不一样。

新的rrd.so中,rrd_fetch返回值:

  1. array(4) {  
  2.   ["start"]=>  
  3.   int(1341834300)  
  4.   ["end"]=>  
  5.   int(1341834600)  
  6.   ["step"]=>  
  7.   int(300)  
  8.   ["data"]=>  
  9.   array(2) {  
  10.     ["ds0"]=>  
  11.     array(1) {  
  12.       [1341834600]=>  
  13.       float(29875732.323333)  
  14.     }  
  15.     ["ds1"]=>  
  16.     array(1) {  
  17.       [1341834600]=>  
  18.       float(139478395.26667)  
  19.     }  
  20.   }  
  21. }  

旧的rrdtool.so中,rrd_fetch返回值:

  1. array(6) {  
  2.   ["start"]=>  
  3.   int(1341834300)  
  4.   ["end"]=>  
  5.   int(1341834600)  
  6.   ["step"]=>  
  7.   int(300)  
  8.   ["ds_cnt"]=>  
  9.   int(2)  
  10.   ["ds_namv"]=>  
  11.   array(2) {  
  12.     [0]=>  
  13.     string(3) "ds0"  
  14.     [1]=>  
  15.     string(3) "ds1"  
  16.   }  
  17.   ["data"]=>  
  18.   array(2) {  
  19.     [0]=>  
  20.     float(1073.00666667)  
  21.     [1]=>  
  22.     float(32.9566666667)  
  23.   }  
  24. }  

原因大概是:https://bugs.php.net/bug.php?id=59575&edit=3

  1. [2011-03-02 04:26 UTC] koubel at seznam dot cz  
  2. 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已经升级完了,没办法,只好先搞个临时解决方案

  1. #旧版本的rrd_fetch返回格式与新版本不同,过渡阶段需要用下面的函数将新版本rrd_fetch的返回值,改成旧版本的格式,才能兼容旧版本代码  
  2. function my_rrd_fetch($file_path$opts , $count = 0) {  
  3.     $ret = rrd_fetch($file_path$opts);  
  4.     if(!$ret)  
  5.         return false;  
  6.   
  7.   
  8.     $start = $ret['start'];  
  9.     $end = $ret['end'];  
  10.     $step = $ret['step'];  
  11.     $ds_cnt = 0;  
  12.     $ds_namv = array();  
  13.     $data = array();  
  14.     $tmpdata = array();  
  15.     foreach($ret['data'as $key => $values) {  
  16.         $ds_namv[] = $key;  
  17.         $ds_cnt++;  
  18.         foreach($values as $time => $value) {  
  19.             $tmpdata[] = $value;              
  20.         }  
  21.     }  
  22.   
  23.   
  24.     $count = count($tmpdata);  
  25.     for($i = 0; $i < ($count/2); $i++){  
  26.         $data[] = $tmpdata[$i];  
  27.         $data[] = $tmpdata[$i + ($count/2)];  
  28.     }  
  29.   
  30.   
  31.     return array('start' => $start'end' => $end'step' => $step'ds_cnt' => $ds_cnt'ds_namv' => $ds_namv'data' => $data);  
  32. }  

用上面的my_rrd_fetch来替换以前的rrd_fetch,功能就是将新版的rrd_fetch的返回值改成旧版的返回,用于临时兼容旧版本代码...

当然后期还是要慢慢的都改成新函数才可以...

相关内容