开发者

Get Windows Uptime/Load with PHP?

Our billing system supports network monitoring and shows uptime and load percentage, however, the PHP status script they provide says it is Linux only. Configuring PHP to work with Server 2008 is not an issue, but I don't know PHP. Would it be possible to manipulate this code to work on 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_g开发者_如何学运维et_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";
}

?>


This version combines some of the ideas suggested here and some of my own into a file that should work roughly the same on both *nix and Windows. Also corrected a few glaring errors/lazy codes in the original.

Will not work on Windows if exec() is disabled. There is no way around this that I can see.

Let me know how you get on.

<?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";

}


You can try the following on a windows box to get the system uptime in a string:

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

If you want the data in a different format you'll probably need to use a regex, but it looks like your script is just dumping the information to an xml file.


For uptime, you can do an exec() call against systeminfo | find "System Up" and then process the output.

For load, you can run wmic /namespace:\\root\cimv2 path Win32_Processor get LoadPercentage, though this only gets the current CPU load and not the historical averages.

At any rate, you will have to detect the operating system (see PHP_OS) and run the correct commands for the system your script is running on.


<?php echo shell_exec("systeminfo |find 'Up Time'");?>

But you need to set php max execution time at least to 120 (execution of this command takes some time)


try This :

Code : 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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜