Получить Windows Uptime / Загрузить с помощью PHP? - PullRequest
2 голосов
/ 05 октября 2011

Наша биллинговая система поддерживает мониторинг сети и показывает время безотказной работы и процент загрузки, однако предоставляемый ими скрипт состояния PHP говорит, что это только Linux.Настройка PHP для работы с Server 2008 не проблема, но я не знаю PHP.Можно ли будет манипулировать этим кодом для работы в Windows?

<?php
/*
*************************************************************************
*                                                                       *
* WHMCompleteSolution - Client Management, Billing & Support System     *
* Copyright (c) 2007-2008 WHMCS. All Rights Reserved,                   *
* Release Date: 12th December 2008                                      *
* Version 3.8.1 Stable                                                  *
*                                                                       *
*************************************************************************
*                                                                       *
* Email: info@whmcs.com                                                 *
* Website: htttp://www.whmcs.com                                        *
*                                                                       *
*************************************************************************

This file can be uploaded to each of your linux web servers in order to
display current load and uptime statistics for the server in the Server
Status page of the WHMCS Client Area and Admin Area Homepage

*/

error_reporting(0);

if (ini_get('disable_functions')) {
    $disabled_funcs=array_map('trim',explode(',',ini_get('disable_functions')));
}

$action=$_GET["action"];

if ($action=="phpinfo") {
} else {
    $users[0]="Unavailable";
    $users[1]="--";
    $loadnow="Unavailable";
    $load15="--";
    $load30="--";
    if (in_array('exec',$disabled_funcs)) {
        $load=file_get_contents("/proc/loadavg");
        $load=explode(' ',$load);
        $loadnow=$load[0];
        $load15=$load[1];
        $load30=$load[2];
    } else {
        $reguptime=trim(exec("uptime"));
        if ($reguptime) {
            if (preg_match("/, *(\d) (users?), .*: (.*), (.*), (.*)/",$reguptime,$uptime)) {
                $users[0]=$uptime[1];
                $users[1]=$uptime[2];
                $loadnow=$uptime[3];
                $load15=$uptime[4];
                $load30=$uptime[5];
            }
        }
    }
    if (in_array('shell_exec',$disabled_funcs)) {
        $uptime_text=file_get_contents("/proc/uptime");
        $uptime=substr($uptime_text,0,strpos($uptime_text," "));
    } else {
        $uptime=shell_exec("cut -d. -f1 /proc/uptime");
    }
    $days=floor($uptime/60/60/24);
    $hours=str_pad($uptime/60/60%24,2,"0",STR_PAD_LEFT);
    $mins=str_pad($uptime/60%60,2,"0",STR_PAD_LEFT);
    $secs=str_pad($uptime%60,2,"0",STR_PAD_LEFT);
    $phpver=phpversion();
    if(function_exists("mysql_get_client_info()")) $mysqlver=mysql_get_client_info();
    if(function_exists("zend_version()")) $zendver=zend_version();
    echo "<load>$loadnow</load>\n";
    echo "<uptime>$days Days $hours:$mins:$secs</uptime>\n";
    echo "<phpver>$phpver</phpver>\n";
    echo "<mysqlver>$mysqlver</mysqlver>\n";
    echo "<zendver>$zendver</zendver>\n";
}

?>

Ответы [ 5 ]

1 голос
/ 05 октября 2011

Эта версия объединяет некоторые идеи, предложенные здесь, и некоторые мои собственные в файл, который должен работать примерно одинаково как на * nix, так и на Windows. Также исправлено несколько явных ошибок / ленивых кодов в оригинале.

Не будет не работать в Windows, если exec() отключено. Я никак не могу обойти это.

Дайте мне знать, как вы поживаете.

<?php

/*
*************************************************************************
*                                                                       *
* WHMCompleteSolution - Client Management, Billing & Support System     *
* Copyright (c) 2007-2008 WHMCS. All Rights Reserved,                   *
* Release Date: 12th December 2008                                      *
* Version 3.8.1 Stable                                                  *
*                                                                       *
*************************************************************************
*                                                                       *
* Email: info@whmcs.com                                                 *
* Website: htttp://www.whmcs.com                                        *
*                                                                       *
*************************************************************************

  Modified by DaveRandom, Sept 2011

This file can be uploaded to each of your linux/Windows web servers in
order to display current load and uptime statistics for the server in the
Server Status page of the WHMCS Client Area and Admin Area Homepage

*/

error_reporting(0);

if (ini_get('disable_functions')) {
  $disabled_funcs = array_map('trim',explode(',',ini_get('disable_functions')));
}

$action = (isset($_GET["action"])) ? $_GET["action"] : NULL;

if ($action == "phpinfo") {

  // Seems as though something is missing here - maybe phpinfo() ?

} else {

  // Stuff that works everywhere
  $phpver = phpversion();
  $mysqlver = (function_exists("mysql_get_client_info")) ? mysql_get_client_info() : '';
  $zendver = (function_exists("zend_version")) ? zend_version() : '';

  // Default values
  $users[0] = $loadnow = "Unavailable";
  $users[1] = $load15 = $load30 = "--";
  $uptime_str = '';

  if (strpos(strtolower(PHP_OS),'win') !== FALSE) {

    // For Windaz
    if (!in_array('exec',$disabled_funcs)) {

      set_time_limit(150); // 'systeminfo' command can take a while...

      $uptime = exec('systeminfo | find "System Up"');
      $parts = explode(':',$uptime);
      $parts = array_pop($parts);
      $parts = explode(',',trim($parts));
      foreach (array('days','hours','mins','secs') as $k => $v) {
        $parts[$k] = explode(' ',trim($parts[$k]));
        $$v = ($k) ? str_pad(array_shift($parts[$k]),2,'0',STR_PAD_LEFT) : array_shift($parts[$k]);
      }
      $uptime_str = "$days Days $hours:$mins:$secs";

      exec('typeperf -sc 1 "\Processor(*)\% Processor Time"',$result);
      for ($i = 0; trim($result[$i]) == ''; $i++) continue;
      $parts = explode(',',$result[++$i]);
      $loadnow = (is_numeric($loadnow = trim(trim(array_pop($parts)),'"\''))) ? $loadnow : 'Unavailable';

    }

  } else {

    // For *nix

    if (in_array('exec',$disabled_funcs)) {
      $load = file_get_contents("/proc/loadavg");
      $load = explode(' ',$load);
      $loadnow = $load[0];
      $load15 = $load[1];
      $load30 = $load[2];
    } else if (($reguptime = trim(exec("uptime"))) && preg_match("/, *(\\d) (users?), .*: (.*), (.*), (.*)/",$reguptime,$uptime)) {
      $users[0] = $uptime[1];
      $users[1] = $uptime[2];
      $loadnow = $uptime[3];
      $load15 = $uptime[4];
      $load30 = $uptime[5];
    }
    if (in_array('shell_exec',$disabled_funcs)) {
      $uptime_text = file_get_contents("/proc/uptime");
      $uptime = substr($uptime_text,0,strpos($uptime_text," "));
    } else {
      $uptime = shell_exec("cut -d. -f1 /proc/uptime");
    }
    $days = floor($uptime/60/60/24);
    $hours = str_pad($uptime/60/60%24,2,"0",STR_PAD_LEFT);
    $mins = str_pad($uptime/60%60,2,"0",STR_PAD_LEFT);
    $secs = str_pad($uptime%60,2,"0",STR_PAD_LEFT);
    $uptime_str = "$days Days $hours:$mins:$secs";

  }

  echo "<load>$loadnow</load>\n";
  echo "<uptime>$uptime_str</uptime>\n";
  echo "<phpver>$phpver</phpver>\n";
  echo "<mysqlver>$mysqlver</mysqlver>\n";
  echo "<zendver>$zendver</zendver>\n";

}
0 голосов
/ 23 июня 2018

Попробуйте это:

Код: https://miladworkshop.ir/paste/Uzype9

<?php
/*
    This Code Create By Milad Maldar ( miladworkshop )
    Website     : https://miladworkshop.ir
    Telegram    : @miladworkshop
*/

function service_uptime()
{
    $uptime_sys     = exec('net statistics server | find "Statistics since"');
    $uptime_sys     = str_replace("Statistics since ", "", $uptime_sys);

    $uptime_dte     = exec('date | find "The current date is:"');
    $uptime_dte     = str_replace("The current date is: Sat ", "", $uptime_dte);
    $uptime_dte     = explode("/", $uptime_dte);

    $uptime_tme     = exec('time | find "The current time is:"');
    $uptime_tme     = str_replace("The current time is: ", "", $uptime_tme);
    $uptime_tme     = explode(":", $uptime_tme);

    $uptime_date    = explode("/", $uptime_sys);
    $uptime_time    = explode(":", $uptime_sys);

    $system_time    = strtotime("{$uptime_dte[2]}-{$uptime_dte[0]}-{$uptime_dte[1]} {$uptime_tme[0]}:{$uptime_tme[1]}:{$uptime_tme[2]}");

    $y              = substr($uptime_date[2], 0, 4);
    $m              = ($uptime_date[0] < 10) ? "0". $uptime_date[0] : $uptime_date[0];
    $d              = ($uptime_date[1] < 10) ? "0". $uptime_date[1] : $uptime_date[1];
    $i              = ($uptime_time[1] < 10) ? "0". $uptime_time[1] : $uptime_time[1];
    $h              = (substr($uptime_time[0], strpos($uptime_time[0], "{$y} ") + 5) < 10) ? "0". substr($uptime_time[0], strpos($uptime_time[0], "{$y} ") + 5) : substr($uptime_time[0], strpos($uptime_time[0], "{$y} ") + 5);

    if (substr($uptime_sys, -2) == "PM")
    {
        $h = str_replace("01", "13", $h);
        $h = str_replace("02", "14", $h);
        $h = str_replace("03", "15", $h);
        $h = str_replace("04", "16", $h);
        $h = str_replace("05", "17", $h);
        $h = str_replace("06", "18", $h);
        $h = str_replace("07", "19", $h);
        $h = str_replace("08", "20", $h);
        $h = str_replace("09", "21", $h);
        $h = str_replace("10", "22", $h);
        $h = str_replace("11", "23", $h);
        $h = str_replace("12", "00", $h);
    }

    $up                 = strtotime("{$y}-{$m}-{$d} {$h}:{$i}:00");

    $string             = "";
    $seconds            = $system_time - $up;

    $days               = intval(intval($seconds) / (3600*24));
    $hours              = (intval($seconds) / 3600) % 24;
    $minutes            = (intval($seconds) / 60) % 60;
    $seconds            = (intval($seconds)) % 60;

    if($days> 0)        { $string .= "{$days} days ";       }
    if($hours > 0)      { $string .= "{$hours} hours ";         }
    if($minutes > 0)    { $string .= "{$minutes} minutes ";     }
    if ($seconds > 0)   { $string .= "{$seconds} seconds";  }

    return $string;
}

echo service_uptime();
?>
0 голосов
/ 05 октября 2011

Вы можете попробовать следующее в окне Windows, чтобы получить время работы системы в строке:

$uptimeData = shell_exec('systeminfo | find "Time:"');

Если вам нужны данные в другом формате, вам, вероятно, потребуется использовать регулярное выражение, но похоже, что ваш скрипт просто выводит информацию в XML-файл.

0 голосов
/ 05 октября 2011
<?php echo shell_exec("systeminfo |find 'Up Time'");?>

Но вам нужно установить максимальное время выполнения php как минимум на 120 (выполнение этой команды занимает некоторое время)

0 голосов
/ 05 октября 2011

Для доступности вы можете сделать exec() вызов systeminfo | find "System Up" и затем обработать вывод.

Для загрузки вы можете запустить wmic /namespace:\\root\cimv2 path Win32_Processor get LoadPercentage, хотя она получает только текущую загрузку процессора, а не исторические средние значения.

В любом случае вам придется обнаружить операционную систему (см. PHP_OS) и выполнить правильные команды для системы, в которой работает ваш скрипт.

...