Linux
Automação de scripts com PHP
by Michael Mafort on ago.12, 2010, under Linux, PHP
Programadores em ambiente linux já estão acostumados a fazerem diversos scripts para automatizarem tarefas utilizando o sh ou bash.
No entanto, não menosprezando o poder de tal linguagem, para quem está mais familiarizado com o PHP uma boa alternativa para gerar estes scripts é utilizando o próprio PHP.
Para isto precisamos de ter o php-client instalado, no ubuntu basta um “apt-get install php5-cli” para tê-lo instalado. Depois de instalado basta criar o seu arquivo php normalmente, como se estivesse usando-o dentro do apache.
Agora mudando para funcionar no prompt.
Na primeira linha do programa insira o seguinte:
#!/usr/bin/php
Seu script vai ficar mais ou menos assim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/php <?php //Codigo de exemplo class Automatizar{ public function __construct(){ echo "Instanciado a classe."; } public function acao( $parametro1, $parametro2 ){ echo "Estou passando o $parametro1 e $parametro2 para o php."; } } $auto = new Automatizar; $auto->acao( $argv[1], $argv[2] ); ?> |
Para executar o script basta dar permissão de execução no arquivo:
1 | chmod 0777 script.php |
E executá-lo apenas chamando ele no console
1 | ./script.php MeuPrimeiroParametro "Meu segundo parametro" |
A saída será
Instanciado a classe.
Estou passando o MeuPrimeiroParametro e Meu segundo parametro para o php.
No código php a variável $argv recebe os valores passados como parametro no script, conforme exemplo acima, o primeiro elemento $argv[0] é o próprio nome do arquivo executado “script.php” e os demais vão seguindo a ordem que foi passada.
Para saber quantos argumentos foram passados tem a variavel global $argc que retorna a contagem dos argumentos.
Agora é correr e fazer os scripts em php para automações em shell.
Facilidades para sua vida – Parte 9 – Vantagens do uso do SSH (locaweb, dreamhost)
by Michael Mafort on ago.23, 2009, under Acessibilidade, Facilidades para sua vida, Linux, Mysql, PHP
O uso do SSH por usuários linux é muito recorrente, pois traz muitas facilidades de acesso remoto a máquina onde se deseja executar alguma tarefa.
Hospedagens mais profissionais como na locaweb, dreamhost, goodady entre outros lhe oferecem esta ferramenta de acesso e gerenciamento do seu site.
Algumas coisas práticas que podemos fazer com o uso do ssh:
- Criar shell scripts para executar tarefas de backup, como já escrito no meu blog sobre backup do mysql, você pode criar um shell script para fazer o backup e gravar num diretório que não é acessivel pelo público.
- Vai subir um site que tem muitos arquivos (Normalmente quando você utiliza algum editor wysiwyg, tipo tyneMCE, fckEditor, entre outros) ? Que tal zipar a pasta e enviar via ftp para o site e depois via ssh você descompacta esta pasta no servidor? Muito fácil e útil. O contrário também é valido, zipar o site pra depois baixar.
- Usa o svn para controlar as versões dos seus arquivos que estão em desenvolvimento? Então você poderá simplesmente exportar a ultima versão, que será a publicada em produção diretamente no servidor.
- Sabe aquele site que vai dar manutenção, e tem 30 mil imagens, que no novo layout vão ter ela em tres tamanhos diferentes? E agora o que fazer, mandar para o design recortar uma por uma, jogar no html e forçar o tamanho, fazendo o usuário baixar mais do que precisava? Nada disso, você pode simplesmente criar um shell script para junto com o imagemagick redimencionar estas imagens, e como vai estar rodando diretamente no servidor atravez do shell, isso vai ser bem rápido.
Já que falei um pouco dos beneficios, que você descobrirá muito mais quando estiver utilizando, então vai umas dicas de como usar:
Para conectar em ambiente linux você pode abrir o console e digitar o seguinte:
ssh nome_usuario@seusite.com.br [enter]
senha: [digite sua senha, ela não irá aparecer, mas está sendo digitada] [enter]
Se você usa windows você pode utilizar o putty, disponível para download em http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Aqui http://ajuda.locaweb.com.br/pt-br/Configurando_o_Putty você tem um tutorial de como se conectar usando o putty.
Alguns cuidados são extremamente importantes, como o uso de alguns comandos que poderão te atrapalhar um pouco, o uso de rm (REMOVE) irá excluir os arquivos que você passar como parametro, deve ser usado com cautela.
Shell Scripts devem ser testados antes de inseridos no site, para evitar algum tipo de travamento, ou loop infinito.
Alguns comandos básicos que poderá usar:
Zipar arquivos:
zip -r nomedozip.zip diretorio_a_ser_zipado
zip nomedozip.zip arquivo.ext
Descompactar zip:
unzip nomedozip.zip
ImageMagick, redimensionar imagem:
convert -resize [tamanho] arquivo.jpg arquivo_thum.jpg
ex.: convert -resize 200 arquivo.jpg arquivo_thum.jpg
Alguns exemplos podem ser vistos no site do ImageMagick [http://www.imagemagick.org/Usage/]
O uso do svn, tem outro post no meu blog a respeito.
Outras referencias:
Wiki Locaweb: http://ajuda.locaweb.com.br/pt-br/SSH (Como conectar na locaweb usando ssh)
Wiki Dreamhost: http://wiki.dreamhost.com/Ssh (Conectando via ssh na dreamhost)
Facilidades para sua vida – Parte 8 – Cronjobs com cakephp
by Michael Mafort on fev.26, 2009, under CakePHP, Facilidades para sua vida, Linux, PHP
Bom pessoal, de volta a ativa, vou neste post falar um pouco sobre como utilizar tarefas agendadas utilizando o crontab do linux.
Primeiro passo, copie o arquivo webroot/index.php para cron_dispatcher.php.
No cakephp versão final 1.2.1.8004, a linha a ser editada é após a 83, que está o seguinte código:
1 2 3 | if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) { trigger_error("CakePHP core could not be found. Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php. It should point to the directory containing your " . DS . "cake core directory and your " . DS . "vendors root directory.", E_USER_ERROR); } |
Você irá substituir para:
1 2 3 4 5 6 7 8 9 10 | if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) { trigger_error("CakePHP core could not be found. Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php. It should point to the directory containing your " . DS . "cake core directory and your " . DS . "vendors root directory.", E_USER_ERROR); } else { define(‘CRON_DISPATCHER’, true); if($argc == 2) { $Dispatcher = new Dispatcher(); $Dispatcher -> dispatch($argv[1]); } } |
Assim seu script dará acesso ao seu controller através do dispatcher, utilizando o phpclient. Para executar o script utilizando o crontab, deve-se fazer o seguinte:
1 | * * * * * php -q /var/www/app/webroot/cron_dispatcher.php /products/cron/ |
Onde os asteriscos na ordem significam:
1 – Minuto (0-59)
2 – Hora (0-23)
3 – Dia (1-31)
4 – Mês (1-12)
5 – Semana (0-6)
Para que os valores repitam sempre utilize o mesmo asterisco, exemplo: para executar o script 1 vez por dia a 0h use:
1 | 0 0 * * * php -q /var/www/app/webroot/cron_dispatcher.php /products/cron/ |
“php -q” executa o arquivo passado a seguir como parametro. neste exemplo vai chamar o arquivo /var/www/app/webroot/cron_dispatcher.php (lembre de passar o caminho absoluto ao arquivo).
O parametro /products/cron/ diz que o seu dispatcher vai chamar o action cron do controller products.
Agora já esta pronto o seu crontab, é só rodar e testar.
Abraço!
Facilidades para sua vida – Parte 6 – Acesso restrito para imagens
by Michael Mafort on jan.29, 2009, under Facilidades para sua vida, Linux, PHP
Bom, hoje no grupo de php surgiu uma dúvida de como fazer um bloqueio de acesso a imagens caso o usuário não tenha permissão (não esteja logado), então sugeri que fosse feito utilizando regras do htaccess, vejamos como ficou.
Vamos seguir o exemplo da seguinte estrutura:
htdocs
- scripts
- img
- etc…
Dentro do diretório img que temos as imagens restritas, vamos criar um arquivo .htaccess.
Lembrando que antes de usar os arquivos .htacess o seu apache deve estar configurado para leitura destes arquivos e o módulo rewrite habilitado.
Para isto basta verificar se seu httpd.conf está com estas configurações:
1 2 3 4 5 6 7 | LoadModule rewrite_module modules/mod_rewrite.so AddModule mod_rewrite.c <directory> Options Indexes FollowSymLinks AllowOverride All </directory> |
Se não tiver basta descomentar as linhas do LoadModule e AddModule, e adicionar dentro do seu directory root as duas linhas, Options e AllowOverride.
Agora vamos criar nosso arquivo .htaccess:
1 2 3 4 5 6 7 8 9 10 11 | <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine on #Verificamos se a imagem é .jpg ou .gif RewriteCond %{REQUEST_FILENAME} (.jpg|.gif)$ #Redirecionamos a requisição para o arquivo index.php #passando como parametro get o nome da imagem $1 RewriteRule ^(.*)$ index.php?image=$1 [NC,L] </IfModule> |
Criamos também o arquivo index.php dentro do diretório img, vamos ao exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php //Inicia a sessão @session_start(); //Setamos a sessão para o teste com o valor 1 //Para testar se não o usuário não está logado, exclua a linha abaixo $_SESSION['uid'] = 1;//logado /* Verifica se existe a sessão, deve ser feito de acordo com sua necessidade Este é apenas um exemplo didático */ if( isset($_SESSION['uid']) ){ //Define o header para o mime type do arquivo requisitado image/jpg ou image/gif header("Content-Type: ".mime_content_type($_GET['image']) ); //Lê o arquivo e joga na saída readfile($_GET['image']); }else{ //Define o Contenty-type como image/gif header("Content-Type: image/gif" ); //Lê o arquivo e joga na saída readfile('deny.gif'); } ?> |
Crie um arquivo chamado deny.gif no seu diretório img para ser exibido caso o usuário não tenha permissão para visualizar as imagens.
Pronto, o acesso as suas imagens já estará bloqueado para usuários que não estejam logados.
Abraço!
Facilidades para sua vida – Parte 5 – Criando backups no mysql
by Michael Mafort on jan.28, 2009, under Facilidades para sua vida, Linux, Mysql
Para criar backups no mysql é muito simples, basta ter o mysqldump instalado em sua máquina, para isto verifique se no diretório onde estão os binários do seu mysql se ele está lá se estiver basta acessar pelo prompt/shell. No windows você pode adicionar o caminho dos arquivos binários ao path do sistema, para que seja acessivel em qualquer lugar, ou então você entra no diretório pelo prompt.
Ex.: cd c:\mysql\bin
Adicionando a váriaveis de ambiente a path do windows (no linux por padrão já deverá estar configurado):
Clique em propriedades do sistema, na aba avançado clique em variáveis de ambiente, em variáveis do sistema clique em path e em editar, adicione ao final do path o caminho para os binários do mysql, no exemplo c:\mysql\bin, lembrando de mantê-lo separado do anterior por um ponto e virgula “;”.
Agora vamos ao backup:
Dump de um banco específico:
1 | mysqldump -h endereco_do_host -u usuario_mysql --password senha_do_usuario --database nome_do_banco > nome_do_arquivo_saida.sql |
Dump de todos os bancos:
1 | mysqldump -h endereco_do_host -u usuario_mysql --password senha_do_usuario --all-databases > nome_do_arquivo_saida.sql |
Explicando:
-h: host do seu mysql. Ex.: mysql.exemplo.com.br, localhost ou o ip do seu banco
-u: usuário do seu mysql.
–password: senha do seu mysql.
–database: nome do banco de dados a ser exportado.
–all-databases: para exportar todos os bancos que o usuário tem permissão.
>: Significa que a saida irá para um arquivo a ser informado a seguir, no nosso exemplo nome_do_arquivo_saida.sql
É isso ai pessoal.
Abraço!
Série facilidades para sua vida – Parte 1: Criando views
by Michael Mafort on jan.21, 2009, under Facilidades para sua vida, Linux, Mysql, PHP
Este é o primeiro post de uma série que poderá lhe ajudar na hora de fazer algo de uma forma mais prática, rápida e elegante. Neste primeiro post vamos tratar das queries gigantes que as vezes encontramos em alguns códigos por ai.Vejamos um exemplo:
Temos as tabelas: usuarios, produtos, vendas, venda_produtos e venda_status.
Onde os campos das tabelas sejam:
usuarios -> id, nome, telefone, endereco
produtos -> id, descricao, valor
vendas -> id, usuario_id, data, venda_status_id
venda_produtos -> id, venda_id, produto_id
venda_status -> id, descricao
Criando as tabelas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | CREATE DATABASE teste_view; USE teste_view; CREATE TABLE usuarios( id int(11) not null auto_increment primary key, nome varchar(60) not null, telefone varchar(15), endereco varchar(200) ); CREATE TABLE produtos( id int(11) not null auto_increment primary key, descricao varchar(120) not null, valor decimal(4,2) ); CREATE TABLE vendas( id int(11) not null auto_increment primary key, usuario_id int(11) not null, data datetime, venda_status_id int(11), index usuario_id(usuario_id), index venda_status_id( venda_status_id ) ); CREATE TABLE venda_produtos( id int(11) not null auto_increment primary key, venda_id int(11) not null, produto_id int(11) not null, index venda_id( venda_id ), index produto_id( produto_id ) ); CREATE TABLE venda_status( id int(11) not null auto_increment primary key, descricao varchar(60) not null, index descricao( descricao ) ); |
Insira dados nas tabelas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #Adicionando usuarios INSERT INTO usuarios (nome, telefone, endereco) VALUES ( 'José pereira', '31 3333-3333', 'rua dos subidos, 123' ); INSERT INTO usuarios (nome, telefone, endereco) VALUES ( 'Maria pereira da silva', '31 4444-4444', 'rua das marias, 12' ); INSERT INTO usuarios (nome, telefone, endereco) VALUES ( 'Willy Nelson', '31 5555-5555', 'rua dos cantores, 120' );#Adicionando produtos INSERT INTO produtos ( descricao, valor ) VALUES ('CAMERA DIGITAL',199.50); INSERT INTO produtos ( descricao, valor ) VALUES ('FILMADORA',999.50); INSERT INTO produtos ( descricao, valor ) VALUES ('GELADEIRA',899.50); INSERT INTO produtos ( descricao, valor ) VALUES ('FOGÃO',399.50); INSERT INTO produtos ( descricao, valor ) VALUES ('CHURRASQUEIRA',99.50); INSERT INTO produtos ( descricao, valor ) VALUES ('NOTEBOOK',1999.50); INSERT INTO produtos ( descricao, valor ) VALUES ('MONITOR LCD 15',399.50); #Adicionando status de vendas INSERT INTO venda_status (descricao) VALUES ('Em processamento'); INSERT INTO venda_status (descricao) VALUES ('Aguardando pagamento'); INSERT INTO venda_status (descricao) VALUES ('Aprovada'); INSERT INTO venda_status (descricao) VALUES ('Cancelada'); #Adicionando vendas INSERT INTO vendas (usuario_id, data, venda_status_id) VALUES (1, '2009-01-20 10:20:00', 1); INSERT INTO vendas (usuario_id, data, venda_status_id) VALUES (2, '2009-01-22 10:22:00', 2); INSERT INTO vendas (usuario_id, data, venda_status_id) VALUES (1, '2009-01-22 10:44:00', 4); #Adicionando produtos as vendas #Nessa compra joão comprou uma camera digital e uma filmadora INSERT INTO venda_produtos (venda_id, produto_id) VALUES (1,1); INSERT INTO venda_produtos (venda_id, produto_id) VALUES (1,2); #Nessa foram comprados por maria um fogão e uma geladeira INSERT INTO venda_produtos (venda_id, produto_id) VALUES (2,4); INSERT INTO venda_produtos (venda_id, produto_id) VALUES (2,3); #Nessa o joão comprou um notebook INSERT INTO venda_produtos (venda_id, produto_id) VALUES (3,6); |
Agora suponhamos que vc queira agrupar estas informações num único select, então teremos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SELECT produtos.descricao AS produto_descricao, produtos.valor AS produto_valor, usuarios.nome AS usuario_nome, usuarios.telefone AS usuario_telefone, usuarios.endereco AS usuario_endereco, venda_status.descricao AS venda_status, vendas.id AS venda_id, vendas.data AS venda_data FROM vendas INNER JOIN venda_produtos ON ( vendas.id = venda_produtos.venda_id ) INNER JOIN produtos ON ( produtos.id = venda_produtos.produto_id ) INNER JOIN usuarios ON ( usuarios.id = vendas.usuario_id ) INNER JOIN venda_status ON ( venda_status.id = vendas.venda_status_id ) |
Agora suponhamos que vc use este select em 3 lugares diferentes, então vc vai ter que passar esta query em 3 locais distintos, podendo gerar uma confusão na hora da manutenção, então para isto existem as views. Elas simulam uma tabela, agem como uma tabela, mas só estão disponíveis para exibir os dados, não podendo sofrer exclusão ou alteração de registros, muito útil ela nestes casos que acabamos ficando com uma query gigante para simplificar nossas vidas.
então para criar a view basta vc adicionar antes da query CREATE VIEW nome_da_view AS ( aqui entra a query ).
Ex.:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | CREATE VIEW view_vendas AS ( SELECT produtos.descricao AS produto_descricao, produtos.valor AS produto_valor, usuarios.nome AS usuario_nome, usuarios.telefone AS usuario_telefone, usuarios.endereco AS usuario_endereco, venda_status.descricao AS venda_status, vendas.id AS venda_id, vendas.data AS venda_data FROM vendas INNER JOIN venda_produtos ON ( vendas.id = venda_produtos.venda_id ) INNER JOIN produtos ON ( produtos.id = venda_produtos.produto_id ) INNER JOIN usuarios ON ( usuarios.id = vendas.usuario_id ) INNER JOIN venda_status ON ( venda_status.id = vendas.venda_status_id ) ); |
Bom agora vc já tem a sua view, para buscar os dados a partir dela faça um select normal. Ex.:
1 2 3 4 5 6 7 | SELECT sum(produto_valor) FROM view_vendas; #ou com um where agora SELECT sum(produto_valor) FROM view_vendas WHERE venda_id = 1;#para visualizar todas as suas views basta dar um SHOW TABLES, que ela estará la como uma tabela. #para certificar que é uma view e não uma tabela mesmo vc pode confirmar usando SHOW CREATE TABLE nome_da_view; |
Bom por hoje é só.
Espero que isto possa facilitar um pouco a sua vida.
Abraços,
Usando um svn client
by Michael Mafort on jan.19, 2009, under Geral, Linux
Bom este artigo vem tratar de como você obter versões de trabalho de projetos controlados pelo subversion, que é um controlador de versão muito eficiente.
Exemplo de necessidade de baixar um código com pelo svn client: Você está acompanhando um projeto e sempre baixa quando sai uma nova versão com novas features e novidades ao monte, só que em vez de ficar esperando para sair sempre uma nova versão vc pode baixar todos os dias uma nova versão que a equipe de desenvolvimento está mexendo e mandou para o repositório. Pois as equipes de desenvolvimento sempre mandam as atualizações no final do dia (depende da filosofia de cada um, mas pratica comum seria esta) e só disponibilizam para download uma versão consolidada com várias features aplicadas, mas com o svn cliente se o projeto estiver no subversion vc pode estar atualizado na ultima versão.
Alguns disponibilizam um zip ou um diretório via ftp nomeado nightly que seria uma forma de se não utilizar um controle de versão aberto para que vc possa baixar.
Vamos ao que interessa:
Para usuários windows:
Baixe o tortoise svn (svn client muito simples e prático), http://tortoisesvn.net/downloads
Instale-o com as configurações padrões, next, next, finish (rs)
Depois de instalado, vamos baixar um repositório de teste (fazer um checkout)
Vamos baixar o projeto do CakePHP (framework php muito bom
)
Va em algum lugar que deseje baixar o arquivo, ex: área de trabalho e clique com o botão direito do mouse sobre a área e clique em SVN Checkout. Em URL of repository entre com a url https://svn.cakephp.org/repo/branches/1.2.x.x deixe como o default e clique em ok.
Para usuários linux (ubuntu):
sudo apt-get install subversion
Para baixar os pacotes svn vá ao diretório que deseja baixar usando o console e digite:
svn co https://svn.cakephp.org/repo/branches/1.2.x.x
pronto já estará baixando sua revisão de trabalho.
Até a próxima pessoal!
Programas do linux no windows
by Michael Mafort on dez.27, 2008, under Linux
Bom vou compartilhar com vocês alguns programas nativos do linux que foram compilados para serem executados no windows, e já de antemão vou dizendo que muitos desses programas são uma “mão na roda”.
A2Ps -> Formata arquivos para Postscript [download link]
Arc -> Cria e extrai arquivos .arc [download link]
Bzip2 -> Melhor compressor de arquivos [download link]
Enscript -> Converte textos para Postscript [download link]
FFMPEG -> Conversor de arquivos de midia (áudio e vídeo) mesmo usado pelo youtube. [download link]
FileUtils -> GNU utilidades para arquivos [download link]
Gzip -> Compressor de arquivos [download link]
Tar -> Agrupa arquivos num único arquivo [downlad link]
Wget -> Baixe arquivos http por este simples e eficiente programa [download link]
Outros programas podem ser vistos em: http://gnuwin32.sourceforge.net/packages.html
Para instalar os programas basta o NNF (next, next e finish)
Depois de instalados recomendo adicionar o diretório que foi instalado no path do windows.
Painel de controle->Propriedades do sistema->Avançado->Variáveis de ambiente->
em Variáveis do sistema na variável path adicionar ; (ponto e virgula que separa os valores) e o caminho até o diretório bin do gnuwin32. Ex.: C:\Arquivos de programas\GnuWin32\bin.
Assim todos os programas poderão ser executados no seu prompt em qualquer diretório que esteja.
Para ver como usa os programas basta dar no prompt o nome do programa –help.
Ex.: bzip2 –help vai te mostrar as opções e modo de uso do programa de compreensão de arquivos.
Abraços a todos.