杂项 函数
在线手册:中文  英文

sys_getloadavg

(PHP 5 >= 5.1.3)

sys_getloadavg获取系统的负载(load average)

说明

array sys_getloadavg ( void )

返回三个系统负载(系统运行队列中的进程数)的样本数据,分别是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 平台下实现。


杂项 函数
在线手册:中文  英文

用户评论:

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])) / $total2); // user+nice+system
   
$iowaitround(100* ($b[4] - $a[4])/$total,2);

?>

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

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.');
        }
    }
}
?>

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

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.

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);
}
}

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.

<?

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).

易百教程