Informática Numaboa - Linux
Scripts PHP no cron
Dom 22 Fev 2009 12:22 |
- Detalhes
- Categoria: Como fazer configurações
- Atualização: Domingo, 22 Fevereiro 2009 15:16
- Autor: vovó Vicki
- Acessos: 11403
O crontab é um programa de agendamento de tarefas que são realizadas automaticamente em intervalos de tempo previamente definidos. Tarefas típicas são a rotação de arquivos de log, o ajuste de data e hora do servidor, etc. Normalmente estas tarefas consistem em rodar shell scripts e programas.
O PHP é uma linguagem de programação para aplicativos web. Há anos programo nesta linguagem e me sinto muito mais confortável criando um script PHP do que um shell script. Aí me veio a seguinte pergunta: será que é possível rodar um script PHP diretamente no console, sem precisar usar um navegador?
Sim! É possível rodar um script PHP no console! Este texto vai mostrar como fazer isto e mais, como rodar scripts PHP no cron. Você deve estar se perguntado para quê tudo isto - é por pura preguiça de ter que aprender e me especializar em mais uma linguagem, por que sou semianalfabeta em shell script
Testando o PHP
A primeira providência é localizar o interpretador PHP. Fiz isto com um whereis:
# whereis php php: /usr/bin/php /usr/lib/php /usr/include/php /usr/man/man1/php.1.gz /usr/share/man/man1/php.1.gz
Você pode obter caminhos diferentes, pois dependem da forma como o PHP foi instalado. Em todo caso, o binário deve estar em algum diretório bin. Sabendo onde está, podemos chamar diretamente o executável com:
/usr/bin/php scriptTeste.php ... ou simplesmente ... php scriptTeste.php
Podemos informar o caminho completo do executável (primeiro exemplo) ou diretamente o executável (segundo exemplo) porque ele se encontra num diretório que faz parte da variável de contexto $PATH:
# echo $PATH /usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin
Agora vamos criar um mini script PHP e colocá-lo num diretório qualquer, digamos /meusPHP:
Para confirmar que o script PHP roda via console basta acionar o executável chamando o script de teste:
# php /meusPHP/scriptTeste.php Passei no teste
Se a mensagem for ecoada na tela, então o script rodou
Exemplo da vida real
Eu tenho um script PHP que faz a manutenção das minhas bases de dados no MySQL. Aqui está um resumo dele:
Este script ficava "escondido" na área dos sites e, de tempos em tempos, eu o chamava pelo browser para que fosse executado. Para quem não sabe, as tabelas que sofrem muitas alterações acabam se fragmentando (o chamado overhead) e o banco de dados vai ficando cada vez mais lento ou a tabela acaba se corrompendo. Daí a necessidade de dar uma otimizada de vez em quando.
E o que é este de vez em quando? Na prática, era quando eu lembrava e, vira e mexe, eu não lembrava Cansada dos meus esquecimentos (e suas consequências desastrosas), resolvi colocar este script PHP no cron.
O crontab
O crontab é um executável (o meu fica em /usr/bin/crontab) que distribui as tarefas agendadas de acordo com um arquivo de configuração que fica em /var/spool/cron/crontabs. Cada usuário da máquina pode ter um arquivo de configuração próprio, mas só o root pode criá-los. Para saber como está a sua configuração, chame o crontab:
# crontab crontab 2.3.3 crontab filereplace crontab from file crontab - replace crontab from stdin crontab -u user specify user crontab -l [user] list crontab for user crontab -e [user] edit crontab for user crontab -d [user] delete crontab for user crontab -c dir specify crontab directory
Observe que o crontab com a opção -l lista a configuração do usuário. Faça isto:
# crontab -l # If you don't want the output of a cron job mailed to you, you have to direct # any output to /dev/null. We'll do this here since these jobs should run # properly on a newly installed system, but if they don't the average newbie # might get quite perplexed about getting strange mail every 5 minutes. :^) # # Run the hourly, daily, weekly, and monthly cron jobs. # Jobs that need different timing may be entered into the crontab as before, # but most really don't need greater granularity than this. If the exact # times of the hourly, daily, weekly, and monthly cron jobs do not suit your # needs, feel free to adjust them. # # Run hourly cron jobs at 47 minutes after the hour: 47 * * * * /usr/bin/run-parts /etc/cron.hourly 1> /dev/null # # Run daily cron jobs at 2:40 every day: 40 2 * * * /usr/bin/run-parts /etc/cron.daily 1> /dev/null # # Run weekly cron jobs at 2:30 on the first day of the week: 30 2 * * 0 /usr/bin/run-parts /etc/cron.weekly 1> /dev/null # # Run monthly cron jobs at 2:20 on the first day of the month: 20 2 1 * * /usr/bin/run-parts /etc/cron.monthly 1> /dev/null
Toda linha de comando possui 6 campos separados por um espaço ou tab. Cada um destes campos tem um significado específico:
- Minutos
- Hora
- Dia do mês
- Mês
- Dia da semana
- Programa para execução
Assim, se eu quiser que o script de otimização de tabelas seja executado todo segundo dia da semana às 3:50 hs basta colocar o script no diretório apropriado e acrescentar a seguinte linha ao crontab do usuário root:
# # Rodar semanalmente o otimizador de tabelas às 3:50: 50 3 * * 1 php /meusPHP/otimizar.php
Você pode editar diretamente o arquivo /var/spool/cron/crontabs/root ou editá-lo usando o crontab:
# crontab -e
Finalmente posso me dar ao luxo de esquecer de otimizar tabelas - o crontab se encarrega do serviço e eu não fico com a consciência pesada.