©
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
(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).