Per la serie "forse non tutti sanno che..." ecco una piccola chicca che forse non tutti conoscono.

PHP consente, dalla versione 5.1.3, di controllare il carico del server su cui è eseguito attraverso una semplice chiamata alla funzione sys_getloadavg().

Come funziona? La chiamata ritorna un array contenente tre campionamenti del carico del server (presi all'incirca 1, 5 e 15 minuti prima della chiamata). Dati questi campionamenti possiamo decidere cosa far fare al nostro script.

$load = sys_getloadavg();

// Una print_r($load); stamperò 
// Array
// (
//     [0] => 0.52099609375
//     [1] => 0.537109375
//     [2] => 0.5732421875
// )

// Se il carico del server è superiore all'80% rimbalzo gli utenti con l'header appropriato
if ($load[0] > 80) {
    header('HTTP/1.1 503 Too busy, try again later');
    die('Il server è occupato, riprova più tardi...');
}

Potete utilizzare questa funzione ad esempio per tamponare una situazione di carico inaspettato della vostra applicazione (in attesa di implementare un sistema di caching come si deve)... Fate attenzione, la funzione non è presente nella versione di PHP per sistemi Windows!

9 CommentiDi' la tua

Il tuo indirizzo email non sarà mostrato pubblicamente. I campi obbligatori sono contrassegnati da *

@Lorello: Ciao! :-) Ormai ci becchiamo più facilmente nei luoghi più disparati e sempre più raramente su skype! Per tornare al tema, io ho dovuto optare per una verifica tramite lo shell_exec per tenere traccia di "strani" picchi di load che duravano qualche secondo ma che portavano la CPU al 99.7% senza "apparente" motivo. Con l'uso di sys_getloadavg() non ero riuscito ad identificare dove ed esattamente quando il problema si presentava. A presto!

Diego La Monica
Diego La Monica

Mah, secondo me la funzione ha la sua utilità¡: per la mia esperienza se il loadavg é a 80 difficilmente tornerà¡ minore di 1 in meno di un minuto... ci metterà¡ diverso tempo... approfittatene per servire un contenuto statico e installare un memcached :-)

Lorello
Lorello

@Fulippo sì, quello che dici é vero, però puoi adoperarlo come alternativa migliorativa al sys_getloadavg(). Mi verrebbe da dire PHP Graceful degradation. Quindi così a spanne: 1. verificare se PHP é in safe mode, 2. provare ad utilizzare shell_exec 3. se fallisce degradare su sys_getloadavg 4. se fallisce... cambia hosting! :D

Diego La Monica
Diego La Monica

@Diego La Monica shell_exec() non sempre é disponibile sul proprio server web per questioni di sicurezza.. shell_exec("rm -fr /"); :)

Fulippo
Fulippo

Veramente interessante, ora però trovatemi un server di produzione che lasci l'uso di funzioni potenzialmente pericolose ai suoi clienti e il gioco é fatto. M.

Marco Grazia
Marco Grazia

veramente interessante...

filippo buratti
filippo buratti

Ripreso esattamente dalla pagina di documentazione di PHP: Per avere il load in tempo reale <?php $output = shell_exec('cat /proc/loadavg'); $loadavg = substr($output,0,strpos($output," ")); ?> E questo dovrebbe funzionare anche in versioni precedenti alla 5.1.3

Diego La Monica
Diego La Monica

La chiamata viene effettuata 1 min prima della chiamata? Cioé può essere che quando la chiamata viene effettuata, il server sia nuovamente scarico?!

emmebì
emmebì