文字

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 平台下实现。

用户评论:

[#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])) / $total2); // user+nice+system
   
$iowaitround(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).

上一篇: 下一篇: