tadarank afiliados

29 outubro, 2009

Load Limiter - Limitando o load de seu site pra não sobrecarregar o servidor

Ae senhores, bão? bãozão?

Post rápido com uma funçãozinha que fiz quando tava tendo problemas com a hospedagem antiga do meu site (um dia eu conto essa história pra quem não acompanhou pelo twitter. Era a hospedagem da bysite.com.br - agora tô com a ótima PortoFacil.net).

Basicamente, meu site tava tendo muitos acessos E eu, provavelmente, devo ter ativado algum plugin louco no meu site. Resultado: excesso de processamentos no servidor. O bixo não tava dando conta do serviço e a hospedagem me sacaneava tirando meu site do ar por várias horas sem dar explicação, legal né?

Os servidores tem um lance que chamam de Load pra indicar mais ou menos comé que tá a carga nos bixo. É tipo uma média de quantos processos tão na fila. Veja mais explicações aqui se você não souber o que é.

A solução que pensei, além de desativar o plugin, foi fazer uma funçãozinha pra exibir uma página simples caso o server esteja com Load alto. Existem também outras ferramentas pra load balancer que eu optei por não usar por preguiça de aprender a configurar essas parada e ver se servia ao meu caso.

O que a função faz é: Testa se o load do server tá acima do valor que você configurou. Se estiver, executa a função passada no parâmetro. Muito simples mas muito útil pra evitar surpresas com servidores (compartilhados principalmente).

Bora:

0) Crie um novo arquivo e dê o nome de "inc-loadLimiter.php" Este é o conteúdo que você vai colocar dentro dele:

<?php
/*** Limita o processamento de acordo com o server load
By Micox: http://twitter.com/micox - http://elmicox.blogspot.com

Exemplo:
$loadLimiter=10; //limitei meu load a 10
if($loadLimiter){
  include_once "inc-loadLimiter.php";
  function saiVazio(){ 
    header("Cache-Control: no-cache, must-revalidate");
    include("aviso_de_manutencao_simples.htm"); //faça sua própria pág. simples.
    //echo "Em manutenção"; //caso você não queira usar include
    exit();
  }
  execIfLoad($loadLimiter,'saiVazio');
}
***/
function get_server_load($windows = 0) {
//fonte: http://www.videotexto.com.br/forum/viewtopic.php?t=243&sid=910886ae470cefbee204751ab41292d9
        $os = strtolower(PHP_OS);
        if(strpos($os, "win") === false) {
  if(file_exists("/proc/loadavg")) {
         $load = file_get_contents("/proc/loadavg");
         $load = explode(' ', $load);
         return $load[0];
  }
  elseif(function_exists("shell_exec")) {
         $load = explode(' ', `uptime`);
         return $load[count($load)-1];
  }
  else {
         return "";
  }
        }
        elseif($windows) {
  if(class_exists("COM")) {
         $wmi = new COM("WinMgmts:\\\\.");
         $cpus = $wmi->InstancesOf("Win32_Processor");
         
         $cpuload = 0;
         $i = 0;
         while ($cpu = $cpus->Next()) {
    $cpuload += $cpu->LoadPercentage;
    $i++;
         }
         
         $cpuload = round($cpuload / $i, 2);
         return "$cpuload%";
  }
  else {
         return "";
  }
        }
}

function execIfLoad($loadLimit,$callback){
    if(get_server_load()>$loadLimit){ call_user_func($callback); }
}
?>

1) Coloque o código abaixo no começo de todas as páginas do seu site. Como eu uso wordpress, no meu caso, editei o tema e coloquei no header.php.

/**** Limitando o load pra não sobrecarregar o servidor.By Micox ***/
$loadLimiter=40; //limitei meu load a 40
if($loadLimiter){
  include_once "inc-loadLimiter.php"; //você verá esta função logo abaixo
  function saiVazio(){ 
    header("Cache-Control: no-cache, must-revalidate");
    include("aviso_de_manutencao_simples.htm"); //faça sua própria pág. simples.
    exit();
  }
  execIfLoad($loadLimiter,'saiVazio');
}

Prontinho. Dúvidas, manda nos comments.

Gostou da dica acima? Então clica nos botões de compartilhamento abaixo e me ajude a dica a subir no Google.

Um comentário:

  1. Oi. Adorei o seu blog! ^^

    Vamos trocar links? Veja o meu: http://piadasnerds.blogspot.com/ e se assim desejar, me retorne.
    =*

    ResponderExcluir

Resultado! Concursos