Função para verificar load average do servidor

Funciona na maioria dos servers compartilhados:

function get_server_load($windows = 0) {
        $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 "";
  }
        }
}

Use com moderação 😉

Benchark Oracle vs MySQL

Estou estudando a tecnologia oracle, as soluções são realmente interessantes principalmente com “oracle rac”.

Algumas coisas impressionam, como por exemplo,  você está fazendo uma query usando um dos nós do cluster, se o servidor reboota, ou da algum problema, ele roteia automaticamente para o próximo nó e continua a query do ponto que parou, fizemos testes e de fato isso e real, a query para por alguns poucos segundos e depoi segue a execução normalmente.

Fiz um for simples em php para inserção de 10000 registros (sim tem maneiras melhor de inserir, mas era um teste simples) numa tabela chamada “teste” possuindo dois fields:
-> id int key  –> sem auto-increment
-> reg varchar(50)

Trecho do código que usei para o for (em oracle)

for($i=1;$i<=10000;$i++)
{
        $sql = "INSERT INTO country(id, pais) VALUES('".$i."', 'registro-".$i."')";
        $oracle->query($sql);
}

Trecho do código em php

for($i=1;$i<=10000;$i++)
{
        $sql = "INSERT INTO country(id, pais) VALUES('".$i."', 'registro-".$i."')";
        mysql_query($sql, $link);
}

utilizei a função time() do php para medir o timestamp inicial e final, a diferença deles é o tempo da operação em segundos.

Resultados:

–> inicio e fim são timestamp, tempo total em segundos
Oracle:
INICIO: 1316194690
FIM: 1316194729
Tempo Total: 39
Espaço ocupado: 500kb

MySQL INNODB:
INICIO: 1316194769
FIM: 1316194772
Tempo Total: 3
Espaço ocupado: 416Kb

MySQL MyISAM:
INICIO: 1316194854
FIM: 1316194857
Tempo Total: 3
Espaço ocupado: 336.99Kb

Conclusão:
Foi um teste muito simples para afirmar qual é o melhor, mas podemos ver que para operações simples, o mysql é quase 10 vezes mais rápido e ocupa menos espaço em disco.
Porém é fato sabido que o mysql perde performance na medida em que a quantidade de dados vai crescendo, já no oracle, quando isto acontece ele se mantem estável (com perda mínima, ou sem de performance).

Finalizando processos no banco postgresql

Mini-bomba do dia:

Rotina de exclusão de banco/usuario postgres não era executada quando haviam conexões em idle ou queries sendo executadas no momento.

Depois de um tempo de pesquisa eis a solução:

SELECT pg_cancel_backend(procpid) FROM pg_stat_activity WHERE usename = 'BANCO_DE_DADOS';
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE usename = 'BANCO_DE_DADOS';

Bonus stage:
Para visualizar as conexões ativas e garantir que matou todos os pids:

select * from pg_stat_activity WHERE datname='BANCO_DE_DADOS';

Atualização: a function pg_terminate_backend() só funciona em postgre 8.4 ou superior, logo estou procurando outra opção via query  em versões antigas, pois matar os pids via kill não eh uma alternativa no que estou fazendo.

Reativando o ícone de rede no ubuntu

Depois de um tempo de uso (nem uma senama :P), o ícone de rede na barra de tarefas do meu ubuntu simplesmente sumiu.

Procurando no oraculo google achei uma dica que me ajudou muito na solução.

Edite o arquivo /etc/NetworkManager/NetworkManager.conf, deixando-o da seguinte forma:

[main]
plugins=ifupdown,keyfile

[ifupdown]
managed=true

OBS: Uso ubuntu 11.04

Inserindo dados de um select multiplo no banco de dados

Para que o php reconheça todas as opções setadas em um select múltiplo, devemos por [] após o nome do select

<form method=POST...>
<select name=estados[]' multiple>
<option value='SP'>SP</option>
<option value='RJ'>RJ</option>
<option value='RS'>RS</option>
</select>
</form>

Para campos do tipo SET no MySQL, basta usar um implode pra popular os dados:

<?php
$estados = implode(',', $_POST['estados']);

Exibindo e escondendo dinamicamente TR em uma tabela

Custei mas achei, eu tinha uma tabela com algumas TR escondidas via style, porém ao tirar eslas do “display:none” via javascript ficava desalinhado (todo o conteúdo da TR em uma única TD)

Fuçando muito, descobri o problema, o motor de renderização Trident (IE) utiliza  a propriedade block para exibir de forma generica, já os motores webkit (chrome, safari, etc) e gecko (firefox) utilizam “table-row”,

A função salvadora da pátria abaixo:

<script>
function toggle(id){
	if (document.getElementById && document.createTextNode)
	{
		var tr=document.getElementById(id);
		if (tr) {
			if (tr.style.display == 'none') {
				try {
					tr.style.display='table-row';
				} catch(e) {
					tr.style.display = 'block';
				}
			}
			else {
				tr.style.display = 'none';
			}
		}
	}
}
</script>

Atualização 21/03/2012:
Pra usar em uma TD, basta substituir table-row por table-cell

Wireless travando ubuntu

Olá pessoal,

Neste último final de semana resolvi finalmente criar vergonha na cara e remover o windows7 que veio pré-instalado no meu notbook.

Ele é um HP DV5-2112BR, sei que existem notebook muito melhores, mais foi o que o meu dinheiro conseguiu comprar rsrsrs

Bom, primeiramente instalei uma distribuição que gosto muito, o opensuse, porém tive alguns problemas com aceleração 3D e skype,  e devido ao meu limitado tempo não foi possível pesquisar mais a fundo para solução. Logo baixei a ISO do ubuntu 11.04 e instalei.

Tudo funcionou uma marvailha, menos a rede wiereless, o led no F11 (tecla para ativar/desativar a wifi) ficava piscando como louca, alternando constantemente entre ligado/desligado, ele achava as redes sem fio mas nao conectava em nenhuma (nem nas abertas!) e o pior, qdo eu apertava o F11 o ubuntu simplesmente congelava, nem o mouse se mechia, somente resetando!

Pesquisando na net, descobri que o chipset dessa placa de rede (RaLink RT-3090) era compatível com a RT2800, logo provavelmnte o ubuntu estava carregando o driver (modulo) errado ocasionando o erro.

Bem, aqui fica dica e solução, porém vão ter que ter uma rede cabeada pra poder baixar os pacotes dos repositorios (tudo via apt, nem pensem em ficar compilando coisas 😉

Primeiramente, adicione o repositorio do markus no arquivo /etc/apt/sources.list

deb http://ppa.launchpad.net/markus-tisoft/rt3090/ubuntu maverick main
deb-src http://ppa.launchpad.net/markus-tisoft/rt3090/ubuntu natty main

Uma observação importante, nesse ponto, substituir a palavra “natty” no comando acima pela versão do seu ubuntu, abaixo as versões suportadas pelo repositório:

jaunty (9.04)
karmic (9.10)
lucid (10.04)
maverick (10.10)
natty (11.04)

Será necessário tambem importar a chave pgp

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 86F4C28E

Agora atualizaremos os pactoes e instalaremos o driver

apt-get update
apt-get install rt3090-dkms

Infelizmente o trabalho não termina aqui, temos mais alguns arquivos para editar.
Lembrando então que a causa da falha é o fato de carregar o modulo/driver errado, instalar o novo não resolve esse problema, ele ira carregar o modulo certo, depois o errado e irá travar novamente!

Para resolver esta questão temos que colocar o modulo errado na blacklist, e adicionar o correto no arquivo de autoload dos modulos:

Deste modo, edita o arquivo /etc/modprobe.d/blacklist inserindo no final a seguinte linha:

blacklist rt2800pci

E finalmente, para carregar o modulo certo, adicionar no final do arquivo /etc/modules o texto:

rt3090sta

Agora sim, basta reiniciar o seu ubuntu e tudo estará funcionando! ;D

OBS: Os codinomes das versões do ubuntu, retirei de: http://ufpa.br/dicas/linux/li-u-ver.htm

Migrando e-mails

Vamos dizer que você queira ou fazer o backup de suas mensagens em outra conta, outro servidor ou seja migrar os seus e-mails para outra conta de e-mail, basta você utilizar um imapsync(Verifique se o servidor utilizado tem suporte a IMAP):

/usr/bin/imapsync  --host1 imap.abc.com.br --user1 [email protected] --password1 senha123321 --authmech1 LOGIN --host2 imap.def.com.br --user2 [email protected] --password2 321786 --authmech2 LOGIN

Alterações:
imap.abc.com.br = host de origem das mensagens
[email protected] = conta de origem das mensagens
senha123321 = senha da conta “[email protected]

imap.def.com.br = host de destino das mensagens
[email protected] = conta de destino das mensagens
321786 = senha da conta “[email protected]

Caso você encontre dificuldades com SEP:

basta add “–sep1 . –prefix1 INBOX.”, verifique:

/usr/bin/imapsync  --host1 imap.abc.com.br --user1 [email protected] --password1 senha123321 --sep1 . --prefix1 INBOX. --authmech1 LOGIN --host2 imap.def.com.br --user2 [email protected] --password2 321786 --authmech2 LOGIN

Neste caso apenas o servidor de origem das mensagens necessita de SEP