⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graph.php

📁 RESIN 3.2 最新源码
💻 PHP
字号:
<?php/** * Provides the most important status information about the Resin server. */require_once "WEB-INF/php/inc.php";//echo "<pre>";$mbean_server = new MBeanServer();$stat_service = $mbean_server->lookup("resin:type=StatService");if (! $stat_service) {  echo "stat service not available";  return;}  $now = time(0) * 1000;$hour = 3600 * 1000;$full_width = $_GET['width'];$full_height = $_GET['height'];if (! $full_width)  $full_width = 300;  if (! $full_height)  $full_height = 200;$items = $_GET['g'];//echo "<pre>";//var_dump($items);$graph = new StatGraph();//$value[0].attr = "resin:type=CpuLoadAvg";$test_server_id = null;$g_server_unique = true;foreach ($items as $item) {  $stat_data = new StatData();  $stat_data->name = $item[0];  $stat_data->attr = $item[1];  $server_id = $item[2];  if (! $server_id)    $mbean_server = new MBeanServer();  else if ($server_id == "default") {    $mbean_server = new MBeanServer("");    $stat_data->server = $server_id;  }  else {    $mbean_server = new MBeanServer($server_id);    $stat_data->server = $server_id;  }    if (isset($test_server) && $test_server != $server_id)    $g_server_unique = false;  $test_server = $server_id;  $stat_service = $mbean_server->lookup("resin:type=StatService");  if (! $stat_service)    continue;    //  resin_var_dump($stat_data);  $stat = find_stat($stat_service, $stat_data->name, $stat_data->attr);  if (! $stat) {//  resin_var_dump($stat_data);    echo "$item->name with attr=$item->attr is an unknown statistic\n";    return;  }  $stat_data->desc = $stat->description;  $val = $stat_service->statisticsData($stat_data->name, $stat_data->attr,                                       $now - 24 * $hour, $now);  $stat_data->val = $val;  calculate_data_bounds($stat_data);  $graph->add($stat_data);}$min_x = $graph->min_x;$min_y = $graph->min_y;$max_x = $graph->max_x;$max_y = $graph->max_y;if ($min_y > 0)  $min_y = 0;$base_y = pow(10, floor(log10($max_y)));$max_y = ceil($max_y / $base_y) * $base_y;$data_width = $max_x - $min_x;if ($data_width == 0)  $data_width = 1;$data_height = $max_y - $min_y;  if ($data_height == 0)  $data_height = 1;$y0 = 13 * (count($graph->stat_list) + 1) / 2 + 7;$width = $full_width - 50;$height = $full_height - ($y0 + 20);$x0 = 10;//echo $width . " " . $height . "\n";//echo $data_width . " " . $data_height. "\n";$im = imagecreate($full_width, $full_height);$background = imagecolorallocate($im, 0xf8, 0xf8, 0xf0);imagefilledrectangle($im, 0, 0, $full_width, $full_height, $background);//$black = imagecolorallocate($im, 0, 0, 0);$grid_color = imagecolorallocate($im, 0xb0, 0xb0, 0xb0);$grid_low_color = imagecolorallocate($im, 0xe0, 0xe0, 0xe0);$label_color = imagecolorallocate($im, 0x60, 0x60, 0x60);draw_grid($im, $min_x, $min_y, $max_x, $max_y,           $x0, $y0, $width, $height, $grid_low_color, $grid_color);imagerectangle($im, $x0, $y0, $x0 + $width, $y0 + $height, $grid_color);// x, y labels$s = date("H:i", $min_x / 1000);imagestring($im, 2, $x0, $y0 + $height + 2, $s, $label_color);	   $s = date("H:i", $max_x / 1000);imagestring($im, 2, $x0 + $width - 25, $y0 + $height + 2, $s, $label_color);$s = y_label($min_y);imagestring($im, 2, $x0 + $width + 2, $y0 + $height - 10, $s, $label_color);$s = y_label($max_y);imagestring($im, 2, $x0 + $width + 2, $y0, $s, $label_color);$colors[] = array(0xff, 0x00, 0x00); // red$colors[] = array(0x40, 0x40, 0xff); // blue$colors[] = array(0xff, 0xb0, 0x00); // orange$colors[] = array(0x00, 0xc0, 0xc0); // cyan$colors[] = array(0x00, 0x00, 0x00); // black$colors[] = array(0x80, 0x00, 0x80); // magenta$colors[] = array(0xa0, 0xa0, 0xf0); // gray$colors[] = array(0x80, 0x80, 0x00); // brown$colors[] = array(0x10, 0x80, 0x10); // green$colors[] = array(0xff, 0x00, 0xff); // magenta$colors[] = array(0x00, 0xd0, 0x00); // green$colors[] = array(0xff, 0xa0, 0xff); // magenta$colors[] = array(0x80, 0xf0, 0x80); // green$i = 0;$row = 0;foreach ($graph->stat_list as $data) {  $rgb = $colors[$i % count($colors)];    $color = imagecolorallocate($im, $rgb[0], $rgb[1], $rgb[2]);  $desc = $data->desc;  if (! $g_server_unique && $data->server)    $desc .= " [" . $data->server . "]";  $y = 13 * $row;  if ($i % 2 == 0) {    $x = $x0;  }  else {    $x = $x0 + ($full_width - $x0) / 2;        $row++;  }  imageline($im, $x, 9 + $y, $x + 15, 9 + $y, $color);  imagestring($im, 2, $x + 20, 2 + $y, $desc, $label_color);  draw_graph($im, $data->val,             $min_x, $min_y, $data_width, $data_height,             $x0, $y0, $width, $height, $color);  $i++;}header("Content-Type: image/png");imagepng($im);function find_stat($stat_service, $name, $attr){  foreach ($stat_service->getActiveAttributes() as $stat) {    if ($stat->name == $name && $stat->attribute == $attr) {      return $stat;    }  }  return null;}class StatGraph {  var $stat_list;  var $min_x = 0x7fffffffffffffff;  var $max_x = -0x7fffffffffffffff;  var $min_y = 0x7fffffffffffffff;  var $max_y = -0x7fffffffffffffff;  function add($item)  {    if ($item->min_x < $this->min_x)      $this->min_x = $item->min_x;          if ($this->max_x < $item->max_x)      $this->max_x = $item->max_x;          if ($item->min_y < $this->min_y)      $this->min_y = $item->min_y;          if ($this->max_y < $item->max_y)      $this->max_y = $item->max_y;    $this->stat_list[] = $item;  }}class StatData {  var $name;  var $attr;  var $desc;  var $val;  var $min_x;  var $min_y;  var $max_x;  var $max_y;}function y_label($value){  $abs_value = $value < 0 ? - $value : $value;  if ($abs_value > 1e12)    return sprintf("%.2g", $value);  else if ($abs_value >= 1e9)    return sprintf("%.1fG", $value / 1e9);  else if ($abs_value >= 1e6)    return sprintf("%.1fM", $value / 1e6);  else if ($abs_value >= 1e3)    return sprintf("%.1fK", $value / 1e6);  else if ($abs_value >= 0.1)    return sprintf("%.2f", $value);  else    return sprintf("%.2g", $value);}function draw_grid($im,                   $min_x, $min_y, $max_x, $max_y,                   $x0, $y0, $width, $height, $low_color, $high_color){  // x-grid  $x = $min_x;  for ($x = $min_x; $x < $max_x; $x += 3600000) {    $hour_x = ($x + 3599999);    $hour_x -= $hour_x % 3600000;    $hour_time = $hour_x / 1000;    $hour_time += date_create($hour_x)->offset;    $day_hour = $hour_time / 3600 % 24;    if ($hour_x < $max_x) {      $xp = $x0 + ($hour_x - $min_x) * $width / ($max_x - $min_x);      if ($day_hour % 6 == 0) {        $color = $high_color;      }      else        $color = $low_color;      if ($min_x < $x && $x + 3600000 < $max_x) {        $s = date("H", $hour_x / 1000);        imagestring($im, 1, $xp - 2, $y0 + $height + 2, $s, $color);      }      imageline($im, $xp, $y0, $xp, $y0 + $height, $color);    }  }    // y-grid  $y = $min_y;  $digit = (int) ($max_y / pow(10, floor(log10($max_y - $min_y))) + 0.5);  $high_mod = 2;    if ($digit == 1)    $digit = 10;  else if ($digit == 2) {    $high_mod = 5;    $digit = 10;  }  else if ($digit == 3)    $digit = 6;  $delta = ($max_y - $min_y) / $digit;  $i = 1;  for ($y = $min_y + $delta; $y < $max_y; $y += $delta) {    $yp = $y0 + ($y - $min_y) * $height / ($max_y - $min_y);    $color = $i % $high_mod == 0 ? $high_color : $low_color;    imageline($im, $x0, $yp, $x0 + $width, $yp, $color);    $i++;  }}function draw_graph($im, $val,                    $min_x, $min_y, $data_width, $data_height,                    $x0, $y0, $width, $height, $color){  $old_xform = image_get_transform($im);  image_transform_translate($im, $x0, $y0 + $height);  image_transform_scale($im, 1, -1);    $is_first = true;  foreach ($val as $point) {    $data_x = $point->time;    $data_y = $point->value;    $x = ($data_x - $min_x) * $width / $data_width;    $y = ($data_y - $min_y) * $height / $data_height;//    echo $x . ", " . $y . "\n";    if ($is_first) {      imagesetpixel($im, $x, $y, $color);    }    else      imageline($im, $last_x, $last_y, $x, $y, $color);//    imagearc($im, $x, $y, 3, 3, 0, 360, $color);    $last_x = $x;    $last_y = $y;    $is_first = false;  }      $old_xform = image_set_transform($im, $old_xform);}function calculate_data_bounds($stat_data){  $values = $stat_data->val;    $min_x = 0x7ffffffffffffff;  $max_x = -0x7ffffffffffffff;  $min_y = 0x7ffffffffffffff;  $max_y = -0x7ffffffffffffff;    foreach ($values as $data) {    $time = $data->time;    $value = $data->value;    if ($time < $min_x)      $min_x = $time;    if ($max_x < $time)      $max_x = $time;    if ($value < $min_y)      $min_y = $value;    if ($max_y < $value)      $max_y = $value;  }  $stat_data->min_x = $min_x;  $stat_data->min_y = $min_y;  $stat_data->max_x = $max_x;  $stat_data->max_y = $max_y;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -