PHP : vérifiez la charge de votre serveur et adaptez vos scripts php
Pour éviter les surcharges de votre serveur web, il convient de surveiller sa charge cpu et de s'y adapter
Si la charge CPU est trop importante, vous pouvez par exemple forcer l'utilisation de vos fichiers de cache (si vous utilisez un CMS), vous pouvez retarder les scripts pour les délayer (usleep), vous pouvez court circuiter certains traitement facultatifs (comptabilisation de visite pour les stats) etc etc
Pour obtenir la charge CPU de votre serveur il suffit de lire le 1er chiffre dans /proc/loadavg
Ce chiffre est un radio / 100 pour 1 CPU : 1 vaut 100%, 2 vaut 200% (cf man pages).
Mais il convient de diviser cette charge CPU par le nombre de CPU (de coeurs) du serveur, car une charge de processus de 200% équivaut à une charge de 100 sur un processeur bi core.
Voici le script PHP qui va bien :
// --- by tito of Amigang
// -------------------------------------
session_start();
// --- 1/ récupérer le nombre de coeurs du serveur qui vous héberge :
if ( $_SESSION["cores"] == '') {
exec("grep cores /proc/cpuinfo |head -n 1 |sed 's/.* //'", $out,$rc );
if ( ereg('^[0-9]+$',$out[0])) $_SESSION["cores"] = $out[0];
}
// --- 2/ verifie la charge CPU
$loadavg =0 ;
$fd=@fopen('/proc/loadavg','r');
if ( $fd ) {
if ( $loadavg = fscanf($fd, "%f")) { // --- lit la charge systeme
fclose ($fd);
// ramene en % et divise par le nb de coeurs :
$loadavg = ceil( $loadavg[0] *100 /$_SESSION["cores"] ) ;
// si besoin :
if ( $loadavg > 200 ) { echo "Je sature à 200%. A+."; exit(); }
if ( $loadavg >= 100 ) {
sleep( ceil($loadavg/20) ) ;
}
}
}
Voila, après avoir éxecuter ce bout de code,
la variable $loadavg vous donne à peu pres la charge CPU en % de votre machine (à peu pres car il ne tient pas compte des iostats et autres variables d'ajustement)
A vous de mettre ensuite les if qui vont bien pour faire des usleep et autre court circuits ...
Je vous invite à combiner ceci avec une détection des crawlers
PHP : comment détecter les robots (php crawler detect), pour ralentir les crawler proportionellement à la charge cpu de votre machine , ce qui pourrait vous donner aprs avoir compiler ces 2 scripts :
// si crawler et charge > 100 % : bye bye
if ( $crawler && $loadavg >=100 ) {
echo "g bo etre matinal g mal (cpu à $loadavg%), reviens plus tard...";
exit();
}
// si crawler : temporize d'autant que la charge cpu est grande
if ( $crawler ) usleep( 500000 + $loadavg * 10000 );
// pour les autres : temporize aussi mais un peu moins :
else usleep( $loadavg * 10000 );
7 115 clics - Créé le 05/05/2010 par Tito - Modifié le 05/05/2010