sys_getloadavg

(PHP 5 >= 5.1.3, PHP 7)

sys_getloadavgシステムの平均負荷を取得する

説明

array sys_getloadavg ( void )

過去 1、5、15 分間のシステムの平均負荷 (システムの実行キューの中のプロセス数) を表す三つの値を返します。

返り値

(過去 1、5、15 分間の) 三つの値を array で返します。

例1 sys_getloadavg() の例

<?php
$load 
sys_getloadavg();
if (
$load[0] > 80) {
    
header('HTTP/1.1 503 Too busy, try again later');
    die(
'Server too busy. Please try again later.');
}
?>

注意

注意: この関数は Windows 環境にはまだ実装されていません。

add a note add a note

User Contributed Notes 9 notes

up
14
rick at rctonline dot nl
4 years ago
Here is another one that also works on windows. Note that this method is not fast, so be careful in the number of calls to this function.

<?php
function get_server_load() {
   
        if (
stristr(PHP_OS, 'win')) {
       
           
$wmi = new COM("Winmgmts://");
           
$server = $wmi->execquery("SELECT LoadPercentage FROM Win32_Processor");
           
           
$cpu_num = 0;
           
$load_total = 0;
           
            foreach(
$server as $cpu){
               
$cpu_num++;
               
$load_total += $cpu->loadpercentage;
            }
           
           
$load = round($load_total/$cpu_num);
           
        } else {
       
           
$sys_load = sys_getloadavg();
           
$load = $sys_load[0];
       
        }
       
        return (int)
$load;
   
    }
?>
up
4
scott at corelevel dot com
9 years ago
I was having a problem with a large script I need to run - was a loop through about 50,000 records and downloading several pictures for a bunch of them, and updating the database.

the problem came as I started getting visitors to my site, the server would get behind, run out of memory, iowait skyrockets, mysql slows down... was a total downhill spiral.

Use this to fix it.

$load = sys_getloadavg();
$sleep=5;
$maxload=2;
if ($load[0] > $maxload) {
       sleep($sleep);
    echo "Busy server - sleep $sleep seconds<br>";
}

I have to play with the load and the sleep number to find what worked for my script, but now my server does not bog at all.
up
4
tom pittlik
9 years ago
The code below mimics the output of sys_getloadavg(). You may have to tweak the way the substring is captured for different distros.

<?php

function sys_getloadavg_hack()
{
   
$str = substr(strrchr(shell_exec("uptime"),":"),1);
   
$avs = array_map("trim",explode(",",$str));

    return
$avs;
}

print_r(sys_getloadavg_hack());

// Array
// (
//     [0] => 6.24
//     [1] => 4.92
//     [2] => 3.99
// )

?>

This function is a neat way of running low priority or non-essential cron jobs on a busy server - if the load is high, don't continue with the task (and try again in a few minutes time).
up
2
Anonymous
6 years ago
To get just current load avg, you can do :

<?php
$output
= shell_exec('cat /proc/loadavg');
$loadavg = substr($output,0,strpos($output," "));
?>
up
1
vladvarna at gmail dot com
3 years ago
You can emulate loadavg using this. Can also be used to get iowait

<?php
  
function ProcStats()
   {   
      
$fp=fopen("/proc/stat","r");
       if(
false===$fp)
               return
false;
      
$a=explode(' ',fgets($fp));
      
array_shift($a); //get rid of 'cpu'
      
while(!$a[0])
          
array_shift($a); //get rid of ' '
      
var_dump($a);
      
fclose($fp);
       return
$a;
   }

  
$a=ProcStats();
  
sleep(5);
  
$b=ProcStats();

  
  
$total=array_sum($b)-array_sum($a);
  
  
$loadavg = round(100* (($b[0]+$b[1]+$b[2]) - ($a[0]+$a[1]+$a[2])) / $total, 2); // user+nice+system
  
$iowait= round(100* ($b[4] - $a[4])/$total,2);

?>
up
1
828586 at gmail dot com
5 years ago
equivalent for windows
<?php
ob_start
();
passthru('typeperf -sc 1 "\processor(_total)\% processor time"',$status);
$content = ob_get_contents();
ob_end_clean();
if (
$status === 0) {
    if (
preg_match("/\,\"([0-9]+\.[0-9]+)\"/",$content,$load)) {
        if (
$load[1] > get_config('busy_error')) {
           
header('HTTP/1.1 503 Too busy, try again later');
            die(
'Server too busy. Please try again later.');
        }
    }
}
?>
up
1
stanislav dot eckert at vizson dot de
25 days ago
Function to get current CPU load as percentage value under Windows and Linux.

Note: Function is getServerLoad(). It will return a decimal value as percentage of current CPU load or NULL if something went wrong (e. g. insufficient access rights).

<?php

    header
("Content-Type: text/plain");

    function
_getServerLoadLinuxData()
    {
        if (
is_readable("/proc/stat"))
        {
           
$stats = @file_get_contents("/proc/stat");

            if (
$stats !== false)
            {
               
// Remove double spaces to make it easier to extract values with explode()
               
$stats = preg_replace("/[[:blank:]]+/", " ", $stats);

               
// Separate lines
               
$stats = str_replace(array("\r\n", "\n\r", "\r"), "\n", $stats);
               
$stats = explode("\n", $stats);

               
// Separate values and find line for main CPU load
               
foreach ($stats as $statLine)
                {
                   
$statLineData = explode(" ", trim($statLine));

                   
// Found!
                   
if
                    (
                        (
count($statLineData) >= 5) &&
                        (
$statLineData[0] == "cpu")
                    )
                    {
                        return array(
                           
$statLineData[1],
                           
$statLineData[2],
                           
$statLineData[3],
                           
$statLineData[4],
                        );
                    }
                }
            }
        }

        return
null;
    }

   
// Returns server load in percent (just number, without percent sign)
   
function getServerLoad()
    {
       
$load = null;

        if (
stristr(PHP_OS, "win"))
        {
           
$cmd = "wmic cpu get loadpercentage /all";
            @
exec($cmd, $output);

            if (
$output)
            {
                foreach (
$output as $line)
                {
                    if (
$line && preg_match("/^[0-9]+\$/", $line))
                    {
                       
$load = $line;
                        break;
                    }
                }
            }
        }
        else
        {
            if (
is_readable("/proc/stat"))
            {
               
// Collect 2 samples - each with 1 second period
                // See: https://de.wikipedia.org/wiki/Load#Der_Load_Average_auf_Unix-Systemen
               
$statData1 = _getServerLoadLinuxData();
               
sleep(1);
               
$statData2 = _getServerLoadLinuxData();

                if
                (
                    (!
is_null($statData1)) &&
                    (!
is_null($statData2))
                )
                {
                   
// Get difference
                   
$statData2[0] -= $statData1[0];
                   
$statData2[1] -= $statData1[1];
                   
$statData2[2] -= $statData1[2];
                   
$statData2[3] -= $statData1[3];

                   
// Sum up the 4 values for User, Nice, System and Idle and calculate
                    // the percentage of idle time (which is part of the 4 values!)
                   
$cpuTime = $statData2[0] + $statData2[1] + $statData2[2] + $statData2[3];

                   
// Invert percentage to get CPU time, not idle time
                   
$load = 100 - ($statData2[3] * 100 / $cpuTime);
                }
            }
        }

        return
$load;
    }

   
//----------------------------

   
$cpuLoad = getServerLoad();
    if (
is_null($cpuLoad)) {
        echo
"CPU load not estimateable (maybe too old Windows or missing rights at Linux or Windows)";
    }
    else {
        echo
$cpuLoad . "%";
    }

?>
up
0
kexianbin at diyism dot com
1 year ago
Use this:
<?php
$loads
=sys_getloadavg();
$core_nums=trim(shell_exec("grep -P '^physical id' /proc/cpuinfo|wc -l"));
$load=$loads[0]/$core_nums;
echo
$load;
?>
up
0
surfchen at gmail dot com
9 years ago
the codes below will provide this function for order versions of PHP.
if (!function_exists('sys_getloadavg')) {
    function sys_getloadavg()
    {
        $loadavg_file = '/proc/loadavg';
        if (file_exists($loadavg_file)) {
            return explode(chr(32),file_get_contents($loadavg_file));
        }
        return array(0,0,0);
    }
}
To Top