Uncategorized

Atualizando servidor centos com git e bitbucket

Quem trabalha com php já deve ter enfrentado a dificuldade em atualizar arquivos via ftp. Sempre são muitos arquivos e o controle de qual arquivo foi envaido é difícil.

Utilizando o git, as coisas ficam mais fáceis. É possível configurar o repositório no bitbucket e realizar um “auto-deploy”.

Para começar é necessário configurar o git no servidor centos:

sudo yum install git
git --version
git config --global user.name "joaoverisssimoribeiro"
git config --global user.mail "joao-verissimo@hotmail.com"

Continuar lendo

Anúncios
Padrão
Uncategorized

Centos mysql problema daemon already running | Another MySQL daemon already running with the same unix socket

Hoje um dos meus servidores caiu. Ao tentar reiniciar o serviço de mysql estava apresentando a mensagem: “Another MySQL daemon already running with the same unix socket”.

A solução é mover o arquivo .sock do mysql e depois reiniciar normalmente.


# mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock.bak

# service mysqld start

Padrão
Uncategorized

SQL para verificar períodos – Verificar período dentro de período em SQL

Para verificar períodos entre datas, o bet

if (this.filtro.isUsaDatas()) {
Date dateInicialSemHora = DateUtils.getDateSemHora(filtro.getDtInicio());
Date dataFinalUltimaHora = DateUtils.highDateTime(filtro.getDtFinal());
sql.appendFiltro(” and ( “);
sql.appendFiltro(” ( ? between dtprevista and dtPrevistaTermino ) “, dateInicialSemHora);
sql.appendFiltro(” OR ( dtprevista between ? and ? )”, dateInicialSemHora, dataFinalUltimaHora);
sql.appendFiltro(” ) “);
}

 

drop table esgptemp_joao;

create table esgptemp_joao (
cd decimal (2,0),
dataini date,
datafim date
);

delete from esgptemp_joao;
insert into esgptemp_joao values (1,TO_DATE(’01/04/2014′, ‘dd/mm/yyyy’), TO_DATE(’03/04/2014′, ‘dd/mm/yyyy’));
insert into esgptemp_joao values (2,TO_DATE(’03/04/2014′, ‘dd/mm/yyyy’), TO_DATE(’08/04/2014′, ‘dd/mm/yyyy’));
insert into esgptemp_joao values (3,TO_DATE(’12/04/2014′, ‘dd/mm/yyyy’), TO_DATE(’20/04/2014′, ‘dd/mm/yyyy’));

insert into esgptemp_joao values (4,TO_DATE(’20/04/2014′, ‘dd/mm/yyyy’), TO_DATE(’21/04/2014′, ‘dd/mm/yyyy’));
insert into esgptemp_joao values (5,TO_DATE(’21/04/2014′, ‘dd/mm/yyyy’), TO_DATE(’06/05/2014′, ‘dd/mm/yyyy’));
insert into esgptemp_joao values (6,TO_DATE(’09/05/2014′, ‘dd/mm/yyyy’), TO_DATE(’12/05/2014′, ‘dd/mm/yyyy’));

insert into esgptemp_joao values (7,TO_DATE(’12/06/2014′, ‘dd/mm/yyyy’), TO_DATE(’15/06/2014′, ‘dd/mm/yyyy’));

/*testa selecionar o primeiro periodo completo: espera registros 1*/
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’01/04/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’01/04/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’03/04/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’03/04/2014′, ‘dd/mm/yyyy’)));

/*testa selecionar um periodo entre 01/04/2014 e 08/04/2015: espera registros 1, 2*/
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’01/04/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’01/04/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’08/04/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’08/04/2014′, ‘dd/mm/yyyy’)));

/*testa selecionar um periodo entre 02/04/2014 e 09/04/2015: espera registros 1,2 */
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’02/04/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’02/04/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’09/04/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’09/04/2014′, ‘dd/mm/yyyy’)));

/*testa selecionar um periodo entre 09/04/2014 e 11/04/2015: espera nenhum registro*/
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’09/04/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’09/04/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’11/04/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’11/04/2014′, ‘dd/mm/yyyy’)));

/*testa selecionar um periodo entre 08/04/2014 e 12/04/2015: espera nenhum registro*/
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’08/04/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’08/04/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’12/04/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’12/04/2014′, ‘dd/mm/yyyy’)));

/*testa selecionar um periodo entre 24/04/2014 e 03/05/2015: espera registro 5*/
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’24/04/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’24/04/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’03/05/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’03/05/2014′, ‘dd/mm/yyyy’)));

/*testa selecionar um periodo entre 01/06/2014 e 30/06/2015: espera registro 7*/
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’01/06/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’01/06/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’30/06/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’30/06/2014′, ‘dd/mm/yyyy’)));

Padrão
Uncategorized

php Medindo o tempo e memória de execução de uma página | Melhorando o desempenho com o Serialize

Estou trabalhando em um projeto que irá exibir um select com todas as cidades do Brasil. É provável que a solução mais comum fosse usar um autocomplete. Porem neste caso o site possui foco em otimização de desempenho o que inviabilizaria as várias requisições ao servidor de um autocomplete.

Logo foi identificado também um gargalo, ao selecionar as mais de 5.000 cidades unidas por um left join ao seus respectivos estados, a página demorava para carregar.

O ponto de partida desse script foi “medir” o tempo e memória consumidas pela página. Para isso foi usado esse script de luders.com.br, com as adaptações o código ficou:


// Iniciamos o "contador"
list($usec, $sec) = explode(' ', microtime());
$script_start = (float) $sec + (float) $usec;

require_once ‘./lib/config.php’;

$cidades = dbCidade::listar(“”, “”);

// Terminamos o “contador” e exibimos
list($usec, $sec) = explode(‘ ‘, microtime());
$script_end = (float) $sec + (float) $usec;
$elapsed_time = round($script_end – $script_start, 5);
echo ‘Elapsed time: ‘, $elapsed_time, ‘ secs. Memory usage: ‘, round(((memory_get_peak_usage(true) / 1024) / 1024), 2), ‘Mb’;

O dbCidade::listar executa um select de todos os campos de cidade + campos de estado. O resultado foi:

Elapsed time: 3.92842 secs. Memory usage: 54.25Mb

Então editei a função dbCidade::listar para usar a função serialize. Utilizo duas funções arquivoCriar e arquivoLer que criam e leem arquivos no sistema.


class dbCidade extends dataTable {
public static function listar() {
//Tenta ler o cache
$retorno = arquivoLer("cache/dbCidadeAll.cache");
if ($retorno) {
return unserialize($retorno);
}

$sql = “SELECT cidade.*, estado.regiao AS estado_regiao…….;

$dados = dataExecSqlDireto($Conexao, $sql, true);
arquivoCriar(serialize($dados), “cache/dbCidadeAll.cache”);
return $dados ;
}
}

A classe e a função listar foram simplificadas para facilitar a leitura. O resultado foi:

Elapsed time: 0.18529 secs. Memory usage: 45Mb

Uma diferença de 3.8 segundos no carregamento. Cabe lembrar que a primeira execução irá demorar. Também deve-se cuidar com cache infinito: dependendo da base de dados pode-se preencher facilmente 40 gb com cache, em especial quando o google bot achar seu sitemap.

Padrão
Uncategorized

Centos Tarefa Cron para Verificar se myqsl/Mariadb está rodando

Hoje vou falar sobre uma coisa simples que fiz no linux, porem poupou bastante trabalho. Estamos usando um servidor na digital ocean. A instância é pequena, e o banco de dados um pouquinho grande.

Ocasionalmente, uma ou duas vezes por mês o banco de dados mysql “cai”. Então é necessário fazer via ssh e reiniciar o servidor. Usando do bash + crontab foi automatizada a verificação, se o mysql não estiver rodando o serviço é reiniciado.

Não sou especialista, por isso pode ser que alguém com mais bagagem possa contribuir. Dentro da pasta ~/executaveis, criei o arquivo checa_mysql.sh:


cd ~/executaveis/
nano checa_mysql.sh
chmod 775 checa_mysql.sh

O chmod altera as permissões para que esse arquivo possa ser executado. O conteúdo de checa_mysql.sh ficou:


if service mysqld status | grep -q 'dead\|stopped'
then service mysqld restart
else echo "mysqld ok"
fi

O comendo service mysqld status verifica se o mysql está rodando. Através do grep verificamos se o retorno do status possui dead ou stopped. Se possuir reinicia através de service mysqld restart, se não, imprime que mysql está ok.

Para adicionar ao cron, bastou:


crontab -e

E no arquivo do cron adicionar a linha:

00 * * * * ~/executaveis/checa_mysql.sh

Será executado todo dia de hora em hora (hora cheia), para salvar o arquivo do cron:


ESC, e digite :wq para salvar


Script cron para Mariadb

Aproveitando para complementar, estou usando em alguns servidores o mariadb. O processo é semelhante:

Arquivo sobe-maria.sh

#!/bin/bash

if systemctl is-active mariadb.service | grep -q ‘inactive\|failed’
then
service mariadb restart
echo “$(date) mariadb sobe” >> “sobe-maria.log”
else
echo “mariadb ok”
fi

E no crontab:

5 * * * * /var/www/sobe-maria.sh

Melhorando o script anterior, agora é gravado o log de execução do serviço. Também o crontab é executado a cada 5 minutos.

Padrão
Uncategorized

PHP código é exibido um uma linha no servidor | T_CONSTANT_ENCAPSED_STRING on line 1

Um erro daqueles aparentemente inexplicáveis ocorreu hoje:


Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING on line 1

A explicação desse erro está com o EOF – End of Line, ou Final de linha, é um caractere que faz a quebra de linha. No Windows é \r\n e no Unix \n. O problema é identificado ao fazer download de um arquivo num servidor linux, edita-lo e fazer upload novamente. Todo o conteúdo deste arquivo fica em apenas uma linha.

A solução está em:

  • Abrir com o Notepad ++;
  • Editar > Conversão final de linha > Converter para Windows.

Também é interessante alterar o modo como o seu gerenciador de ftp envia o arquivo. No filezilla, ‘Arquivo > Gerenciador de Sites > [SITE] > Mapa de caracteres’.

Padrão
Uncategorized

Mysql Performance Descobrir consultas lentas | Ativar o log de slow-queries no CentOs

Estive assistindo a um vídeo no code-squad sobre como melhorar/analisar a performance do mysql. Uma das dicas foi de ativar o log de consultas lentas (log-slow-queries). Para faze-lo no CentOs:

Abra o arquivo /etc/my.cnf:

nano /etc/my.cnf

E adicione os seguintes parâmetros antes de [mysqld_safe]:

##Slow Query Log
long_query_time=1
log-slow-queries=/var/log/mysqld-slow.log

O parâmetro long_query_time define que querys acima de um segundo serão armazenadas no log. Enquanto log-slow-queries é o caminho do arquivo de log.

Então é necessário criar o arquivo, definir as permissões e reiniciar o serviço mysql:

touch /var/log/mysqld-slow.log
chown mysql:mysql -R /var/log/mysqld-slow.log
sudo service mysqld restart

Outra dica legal é ativar o cache de querys. Nas linhas após “log-slow-queries=/var”… adicione:

query_cache_size = 16M
query_cache_type=1

Novamente será necessário reiniciar o mysqld.

Padrão