php RRD图形浮点值而不是整数

php RRD图形浮点值而不是整数,php,graph,floating-point,rrdtool,rrd,Php,Graph,Floating Point,Rrdtool,Rrd,我正在生成一个rrd图,我面临两个问题 问题1:我打印的数字是不带小数的整数,尽管打印时会出现小数。这真是令人困惑。所以我在网上看了一下,虽然我使用了正确的语法,我没有应用任何计算,但我仍然得到浮点值而不是整数 根据官方网站:%s将其放在%le、%lf或%lg之后。这将被适当的国际单位制震级单位取代,并相应地调整数值(123456->123.456 k)。 我附上了一张照片作为输出的样本。我还提供了一个工作示例代码,因此,如果任何人了解RRD,都可以查看可能的错误 问题2:我试图在我的图表上添加

我正在生成一个rrd图,我面临两个问题

问题1:我打印的数字是不带小数的整数,尽管打印时会出现小数。这真是令人困惑。所以我在网上看了一下,虽然我使用了正确的语法,我没有应用任何计算,但我仍然得到浮点值而不是整数

根据官方网站:
%s将其放在%le、%lf或%lg之后。这将被适当的国际单位制震级单位取代,并相应地调整数值(123456->123.456 k)。

我附上了一张照片作为输出的样本。我还提供了一个工作示例代码,因此,如果任何人了解RRD,都可以查看可能的错误

问题2:我试图在我的图表上添加
VRULE:time#color[:legend][:破折号[=开[关]开[关]开[关]…][:破折号偏移=偏移]
功能,并根据在线说明提供时间。因为我的图表在移动,我计划做时间(值)-1800秒。我想在图中间放置一条垂直线,这样我就可以看到平均30分钟的值。当我应用这种格式时,会出现以下错误:

图形错误:参数“1400274668-1800”不代表行中的时间VRULE:1400274668-1800#0000CD:中间值

当我去掉减法时,一切都很好。有没有办法在我的图表中间产生这条线?< /P>
<?php

$file = "snmp";
$rrdFile = dirname(__FILE__) . "/".$file.".rrd";
$in = "losses";
$png = "/home/linux/Desktop/";
$in_min = "vdef_in_min";
$in_max = "vdef_in_max";
$in_lst = "vdef_in_lst";
$in_av = "vdef_in_av";
$title = "Losses RRD::Graph";
$output = array("1h","1d");
$step = 5;
$heartbeat = 2 * $step;

while (1) { 
  sleep (1);

  $options = array(
           "--start","now -15s",
           "--step", "".$step."",
           "DS:".$in.":GAUGE:".$heartbeat.":0:U",
           "RRA:LAST:0.5:1:3600",
           "RRA:MIN:0.5:1:3600",
           "RRA:MAX:0.5:1:3600",
           "RRA:AVERAGE:0.5:6:600",
           "RRA:LAST:0.5:300:288",
           "RRA:MIN:0.5:300:288",
           "RRA:MAX:0.5:300:288`",
           "RRA:AVERAGE:0.5:600:144"
           );

   if ( !isset( $create ) ) {

     $create = rrd_create(
              "".$rrdFile."",
              $options
              );

   if ( $create === FALSE ) {
      echo "Creation error: ".rrd_error()."\n";
   }
  }

  $t = time();
  $losses = rand(0, 150);

  $update = rrd_update(
               "".$rrdFile."",
               array(
                 "".$t.":".$losses.""
                 )
               );

  if ($update === FALSE) {
     echo "Update error: ".rrd_error()."\n";
  }

  date_default_timezone_set('Europe/Stockholm');
  $timezone = new DateTime(NULL, new DateTimeZone('Europe/Stockholm'));
  $date = date('l jS \of F Y h\\:i\\:s A' , $timezone->format('U'));
  $comment = "RRD last updated:".$date;
  $comment = str_replace( ":", "\\:", $comment );
  $graph = "Graph last updated:".$date;
  $graph = str_replace( ":", "\\:", $graph );

  foreach ($output as $test) {

     $final = array(
            "--start","end - ".$test."",
            "--end", "".$t."",
            "--title=".$file." RRD::Graph with - ".$test." Periods",
            "--vertical-label=Bytes(s)/sec",
            "--right-axis-label=latency(ms)",
            "--alt-y-grid", "--rigid",
            "--width", "800", "--height", "500",
            "--lower-limit=0",
            "--no-gridfit",
            "--slope-mode",
            "DEF:".$in."_def=".$file.".rrd:".$in.":LAST",
            "CDEF:inbytes=".$in."_def",
            "VDEF:".$in_lst."=inbytes,LAST",
            "VDEF:".$in_min."=inbytes,MINIMUM",
            "VDEF:".$in_max."=inbytes,MAXIMUM",
            "VDEF:".$in_av."=inbytes,AVERAGE",
            "COMMENT:\\n",
            "LINE2:".$in."_def#FF0000:".$in."",
            "GPRINT:".$in_min.": Minimum\:%6.2lf %S",
            "GPRINT:".$in_max.":Maximum\:%6.2lf %S",
            "GPRINT:".$in_lst.":Last\:%6.2lf %s",
            "GPRINT:".$in_av.":Average\:%6.2lf %s",
            "COMMENT:\\n",
            "VRULE:".$t."#0000CD:Half way values",
            "COMMENT:\\n",
            "HRULE:50#FFFF00:Maximum value",
            "COMMENT:\\n",
            "COMMENT: ",
            "COMMENT:\\n",
            "COMMENT:".$comment."\\r",
            "COMMENT:".$graph."\\r"
            );

    $outputPngFile = rrd_graph(
                   "".$png."".$test.".png",
                   $final
                   );

    if ($outputPngFile === FALSE) {
      echo "<b>Graph error: </b>".rrd_error()."\n";
    }

   }

   $debug = rrd_lastupdate (
                "".$rrdFile.""
                );

   if ($debug === FALSE) {
     echo "<b>Graph result error: </b>".rrd_error()."\n";
   } 

   var_dump ($debug);
 }

?>

第一个问题的答案几乎肯定是数据正常化。由于不是每次都在步长边界上精确更新RRD,因此提交的数据值将标准化为步长边界,从而产生十进制值。要理解这一点,请阅读相关主题

您的第二个问题是,您不能以这种方式使用VRULE声明。VRULE的第一个参数可以是数字或VDEF变量,但不能是公式。因此,
VRULE:12345678#0000CD:Foo
很好,就像
VRULE:vdefname#FF00FF:Bar
一样。但是,您不能使用
VRULE:123456-123#0000CD:No
。请先进行计算,如下所示:

"VRULE:".($t-1800)."#0000CD:Half way values",

。。。这将产生一个有效的语法

再次感谢你给了我更多的阅读和理解的信息,一切都开始变得更有意义了…谢谢你的时间和努力。这是一个很少有人知道的话题。