Esse blog mudou para: http://gustavopaes.net/blog/

Thursday, October 22, 2009

Criando log das execuções de seu cron

Estou realizando um projeto onde a execução de alguns scripts a cada 5 minutos é fundamental. Caso alguma falha ocorra durante execução, conteúdos podem ser perdidos e, para achar o erro, sem um bom log, fica complicado.

A solução que usei para isso foi criar um arquivo shell — o servidor é linux — que executa o script php e armazena a saída em um arquivo de log.

Dessa forma não preciso, no próprio script php, ficar abrindo arquivos (fopen), escrevendo (fwrite) e me preocupando em fechá-los (fclose) assim que finalizar a execução, até porque é uma execução que pode ser finalizada em vários pontos.

O script shell ficou parecido com isso:

#!/bin/sh

BARRA="-------------------------------------\n";
START="`date +%Y-%m-%d\ %R:%S`";
YEARMONTHDAY="`date +%Y-%m-%d`";

# Configs
PHP_LOCAL="/usr/local/bin/php"
CRON_FILE="/home/usuario/public_html/projeto/cron/cron.php"
LOG_FILE="/home/usuario/public_html/projeto/var/cron_$YEARMONTHDAY.log";

$PHP_LOCAL $CRON_FILE >> $LOG_FILE

O arquivo cron.php contém o script que você deve executar. Lá você deve descrever cada atividade que está sendo realizada, imprimindo na tela com o echo do próprio php. Lembre-se que as quebras de linha devem ser com \n e não o br do HTML.

Agora, ao invés de colocar no cron do seu servidor o cron.php, você coloca esse arquivo.sh que você criou.

Sempre que o script for executado, um arquivo de log será criado com a saída do script executado. Se o arquivo de log para aquele dia já existe, ele irá concatenar as saídas, ou seja, você terá o log de todas as execuções.

Segurança

Para evitar que consigam ver esse seu arquivo e possam usá-lo para alguma ação indesejada, proíba que ele seja exibido. Para isso, crie um arquivo .htaccess, se não existir, com o seguinte conteúdo:

<Files *.sh>
  Order Deny,Allow
  Deny from all
</Files>

Dicas

Para descobrir onde o php está em seu servidor, no SSH, digite: whereis php.

Já para descobrir qual o path completo até o seu sistema, digite: pwd.