歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> rrd.so更新導致rrd_fetch返回值變更,與舊版不兼容

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

日期:2017/3/1 10:17:07   编辑:Linux編程

前兩天把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. $start = $ret['start'];
  7. $end = $ret['end'];
  8. $step = $ret['step'];
  9. $ds_cnt = 0;
  10. $ds_namv = array();
  11. $data = array();
  12. $tmpdata = array();
  13. foreach($ret['data'] as $key => $values) {
  14. $ds_namv[] = $key;
  15. $ds_cnt++;
  16. foreach($values as $time => $value) {
  17. $tmpdata[] = $value;
  18. }
  19. }
  20. $count = count($tmpdata);
  21. for($i = 0; $i < ($count/2); $i++){
  22. $data[] = $tmpdata[$i];
  23. $data[] = $tmpdata[$i + ($count/2)];
  24. }
  25. return array('start' => $start, 'end' => $end, 'step' => $step, 'ds_cnt' => $ds_cnt, 'ds_namv' => $ds_namv, 'data' => $data);
  26. }

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

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

Copyright © Linux教程網 All Rights Reserved