Scripts PHP no Cron
Virtual Arts Design :: Webdesign :: Linguagens Web :: PHP
Página 1 de 1
Scripts PHP no Cron
Scripts PHP no cron
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 sorriso
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:
scriptTeste.php
echo 'Passei no teste';
?>
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 comemora
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:
otimizar.php
$server = 'localhost';
$user = 'usuário';
$senha = 'senha';
$dbname = 'base_de_dados';
$ = mysql_connect( $server, $user, $senha );
if( !$ ) {
die( 'Não deu para conectar ' . mysql_error() );
}
$db_select = mysql_select_db( $dbname, $ );
if( !$db_select ) {
die( "Não deu para selecionar $dbname " . mysql_error() );
}
$all_tables = mysql_query( "SHOW TABLES" );
while( $table = mysql_fetch_assoc( $all_tables ) ) {
foreach( $table as $db=>$tablename ) {
mysql_query( "OPTIMIZE TABLE " . $tablename ) or die ( mysql_error () );
}
}
mysql_close( $ );
?>
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 triste 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.
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 sorriso
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:
scriptTeste.php
echo 'Passei no teste';
?>
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 comemora
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:
otimizar.php
$server = 'localhost';
$user = 'usuário';
$senha = 'senha';
$dbname = 'base_de_dados';
$ = mysql_connect( $server, $user, $senha );
if( !$ ) {
die( 'Não deu para conectar ' . mysql_error() );
}
$db_select = mysql_select_db( $dbname, $ );
if( !$db_select ) {
die( "Não deu para selecionar $dbname " . mysql_error() );
}
$all_tables = mysql_query( "SHOW TABLES" );
while( $table = mysql_fetch_assoc( $all_tables ) ) {
foreach( $table as $db=>$tablename ) {
mysql_query( "OPTIMIZE TABLE " . $tablename ) or die ( mysql_error () );
}
}
mysql_close( $ );
?>
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 triste 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.
Virtual Arts Design :: Webdesign :: Linguagens Web :: PHP
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|