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返回值:
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返回值:
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)
  }
}






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

[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.


http://pecl.php.net/package-changelog.php?package=rrd&release=1.1.0

0.10.0 - fixed all reported bugs
- fixed major bug in rrd_fetch #21402
- BC break : rdd_fetch returned array format changed, these items doesn't
exist anymore - "ds_cnt", "ds_namv"




大神觉得ds_cnt、ds_namv这两个参数完全没用,并且还修改了data的返回格式


好吧,新的rrd_fetch确实挺简单,而且还有了数据对应的时间,非常方便,但是过渡阶段怎么办呢?原始系统没办法瞬间改完,但后台rrd已经升级完了,没办法,只好先搞个临时解决方案


#旧版本的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;			
		}
	}


	$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的返回值改成旧版的返回,用于临时兼容旧版本代码...


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

你可能感兴趣的:(String,function,File,Path,float,extension)