A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Linux

Scripts PHP no cron

Dom

22

Fev

2009


12:22

(2 votos, média 4.00 de 5) 


Nível intermediário

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 smile

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 biggrin

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:

$tablename ) { mysql_query( "OPTIMIZE TABLE " . $tablename ) or die ( mysql_error () ); } } mysql_close( $link ); ?>

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 sad 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 file   replace 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.

Vadim Logofet Sberbankспб посудаотзывы никас обзор ноутбуковbentley купитьпосуда стекляннаяалександр лобановский

Informações adicionais