Tarefas agendadas via Cron + PHP

Artigo que explica como utilizar o cron do Linux para realizar tarefas agendadas para um sistema em PHP.

Em sistemas de informação, é comum existirem atividades que precisam ser realizadas sob agendamento. Normalmente esta característica é necessária por um dos motivos:

  1. porque a tarefa precisa ser executada em determinado instante para prover informações a partir daquele momento;
  2. porque a tarefa é muito demorada e é inviável que o usuário que a invoque fique esperando até que ela termine.

Implementar uma ferramenta dessas requer um serviço auxiliar no servidor que possibilite o agendamento de tarefas. No Linux, por exemplo, existe um serviço chamado "cron", que precisa ser instalado e inicializado. Invocando o comando abaixo, é possível editar um arquivo que especifica os comandos a serem executados periodicamente pelo seu usuário:

$ contab -e

O comando crontab utiliza o editor de texto padrão do terminal de comandos, que pode ser especificado através da variável de ambiente $EDITOR. Para especificar os comandos e a periodicidade deles, leia a documentação do crontab.

Uma forma de agendar tarefas de um sistema em PHP é criar um script PHP que rode em linha de comando (php-cli) e solicitar a execução deste script periodicamente.

Porém, existe um problema aí: o comando será executado periodicamente. Alguns requisitos não esperam que o comando seja executado periodicamente, mas que sejam executados sob agendamento, que são coisas diferentes.

Para isso, uma alternativa mais viável é criar um único script PHP que ficará responsável por realizar ou não tarefas agendadas no sistema. Este script pode ser colocado no cron para ser executado diariamente ou de hora em hora (por exemplo), e ele buscaria em BD quais as tarefas que precisam ser executadas. Ou seja, para agendar uma tarefa, bastaria lançar no BD qual a tarefa a ser executada e quando pretende-se executá-la. O script avaliaria as tarefas que precisam ser executadas, executaria e atualizaria os registros no BD para indicar quais já foram executadas (e, opcionalmente, guardaria um resultado textual do processamento).

Note que se você optou por uma periodicidade diária, o seu sistema deve solicitar apenas a data de execução. E se optou por uma periodicidade de hora, o seu sistema pode solicitar o dia e a hora de execução.

Veja um exemplo de arquivo do crontab para executar um script de hora em hora:

00 * * * * /usr/bin/php /caminho/ate/o/script/script.php

Observação: caso tenha acesso de root no servidor que deseja registrar o cron, pode optar por editar diretamente o arquivo "/etc/crontab". A diferança é que antes do comando executado, será necessário informar qual usuário será usado como dono do processo.

2 comentários

hudy disse...

falto especificar o usuário que vai executar o comando:
00 * * * * www-data /usr/bin/php /caminho/ate/o/script/script.php

rubS (autor do blog) disse...

Hudy, não conheço esta forma de definir que o cron é para ser executado por um usuário específico. Sabe me dizer onde encontro esta informação?

Conheço o parâmetro "-u" do crontab. Para definir tarefas para o apache, posso acessar como root e executar:
crontab -u apache -e

Afinal, o usuário do apache normalmente não pode logar.