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.
sys_getloadavg
(PHP 5 >= 5.1.3)
sys_getloadavg — Récupère la charge moyenne du système
Description
array sys_getloadavg
( void
)
Retourne trois échantillons représentant la charge moyenne du système (le nombre de processus dans le système qui est dans le processus de roulement en attente) depuis les dernières 1, 5 et 16 minutes, respectivement.
Valeurs de retour
Retourne un array avec trois échantillons (dernières 1, 5 et 15 minutes).
Exemples
Exemple #1 Exemple avec 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.');
}
?>
Notes
Note: Cette fonction n'est pas implémentée sous Windows.
sys_getloadavg
scott at corelevel dot com
27-Nov-2006 11:47
27-Nov-2006 11:47
surfchen at gmail dot com
06-Jul-2006 06:22
06-Jul-2006 06:22
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
03-Mar-2006 11:36
03-Mar-2006 11:36
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).
