©
                    本文档使用
                    php中文网手册 发布
                
(PHP 5 >= 5.1.3)
sys_getloadavg — 获取系统的负载(load average)
返回三个系统负载(系统运行队列中的进程数)的样本数据,分别是1分钟、5分钟和15分钟之前。
返回一个包含1分钟、5分钟和15分钟之前采样数据的 array 。
Example #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.' );
}
 ?>   Note: 此函数未在 Windows 平台下实现。
[#1] kexianbin at diyism dot com [2014-05-28 10:35:34]
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;
?>
[#2] vladvarna at gmail dot com [2012-07-18 14:51:49]
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);
?>
[#3] rick at rctonline dot nl [2012-01-24 12:57:55]
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;
    
    }
?>
[#4] 828586 at gmail dot com [2010-06-12 07:43:23]
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.');
        }
    }
}
?>
[#5] Anonymous [2009-11-19 12:14:32]
To get just current load avg, you can do :
<?php
$output = shell_exec('cat /proc/loadavg');
$loadavg = substr($output,0,strpos($output," "));
?>
[#6] scott at corelevel dot com [2006-11-27 14:47:46]
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.
[#7] surfchen at gmail dot com [2006-07-06 09:22:18]
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);
	}
}
[#8] tom pittlik [2006-03-03 02:36:21]
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).