Tarefas agendadas (cron): para que servem e como se criam

Uma tarefa agendada, ou cron, é uma ordem que o servidor executa a horas certas, esteja você lá ou não, tenha o site visitas ou não. É das funcionalidades que mais gente tem e menos gente sabe que tem, e é a explicação para metade dos «isto devia ter acontecido sozinho e não aconteceu».

Para que serve, na prática

Quem precisa Do quê
O WordPress Publicações agendadas, verificação de actualizações, limpeza da lixeira e os e-mails que os plugins mandam. Tudo isso passa pelo agendador interno dele.
Lojas online Sincronizar stock, fechar carrinhos abandonados, emitir facturas, enviar o e-mail de «a sua encomenda saiu».
Os seus próprios scripts Importar um ficheiro que um fornecedor deixa todas as noites, apagar ficheiros temporários, gerar um relatório às 7 da manhã.
As suas cópias Um script que exporta a base de dados e a manda para fora do servidor. A cópia que ninguém se lembra de fazer à mão é a que uma tarefa agendada faz sem falhar.

O caso do WordPress, que vale por si

O agendador do WordPress não é um cron: é um ficheiro que só corre quando alguém visita o site. Num site com muitas visitas isso quase não se nota. Num site institucional que recebe meia dúzia de visitas por dia, as tarefas ficam à espera e depois disparam todas ao mesmo tempo, em cima do visitante seguinte, que fica à espera que a página abra.

A cura é tirar-lhe o trabalho: desliga-se o agendador interno e cria-se uma tarefa agendada a sério, com hora. Acrescenta-se ao wp-config.php , antes da linha que diz para parar de editar:

define( 'DISABLE_WP_CRON', true );

e depois cria-se a tarefa no painel, a chamar o wp-cron.php de tempos a tempos. De cinco em cinco minutos chega para quase todos os sites.

Desligar sem criar a tarefa é pior do que não mexer. Se põe a linha no wp-config.php e se esquece do resto, as publicações agendadas deixam de sair, os e-mails da loja deixam de ser enviados e nada dá erro. Faça as duas coisas na mesma sessão, ou nenhuma.

Como se cria

1 No cPanel, na secção Avançado, abra as tarefas agendadas (cron). Se não vir o ícone, escreva cron na caixa de pesquisa do topo do painel.
2 Escolha a periodicidade. Há uma lista de opções comuns (de hora a hora, uma vez por dia, uma vez por semana) que preenche os campos por si. Só precisa dos cinco campos se quiser uma hora que não esteja na lista.
3 Escreva o comando. É a linha que o servidor vai executar, com caminhos completos. O cron não sabe em que pasta você estava nem conhece os atalhos do seu terminal.
4 Guarde e ponha um e-mail seu no campo de notificação, no topo da página. Nos primeiros dias quer receber o que a tarefa escreve, para saber se corre.
Campo O que é
Minuto 0 a 59. 0 é à hora certa.
Hora 0 a 23, na hora do servidor, que pode não ser a sua. Confirme antes de agendar coisas à meia-noite.
Dia do mês 1 a 31. * quer dizer «todos».
Mês 1 a 12.
Dia da semana 0 a 6, começando no domingo.

Os cinco lidos em conjunto: */5 * * * * é de cinco em cinco minutos, 30 4 * * * é todos os dias às 4h30, e 0 6 * * 1 é às 6h de todas as segundas-feiras.

Duas maneiras de chamar a mesma coisa. Um script PHP pode ser executado directamente pelo interpretador, com o caminho completo do PHP e o caminho completo do ficheiro, ou pedido como se fosse uma página, com wget ou curl . A primeira é mais rápida e não passa pela web; a segunda é a que os plugins costumam pedir. Se a aplicação lhe der a linha pronta, use a dela.

Porque é que de minuto a minuto é má ideia

Parece inofensivo e não é. Cada execução arranca um processo, e o processo conta para os limites da sua conta como conta uma visita. Sessenta arranques por hora, 1440 por dia, todos os dias, a competir com os visitantes reais pelos mesmos recursos.

E há o empilhamento. Se a tarefa demora mais de um minuto a terminar, a seguinte arranca antes de a anterior acabar. Depois a terceira. Ao fim de uma hora tem dezenas de cópias do mesmo script a correr ao mesmo tempo, muitas vezes a mexer nos mesmos dados. O sintoma é o site lento sem razão aparente, e o culpado é a tarefa que «não faz nada». De cinco em cinco minutos resolve praticamente tudo o que as pessoas agendam ao minuto.

Como se vê se correu

1 Pelo e-mail. Por omissão, tudo o que a tarefa escreve no ecrã é enviado para o endereço que indicou. Se recebe o e-mail, correu. Se não recebe nada e a tarefa devia escrever alguma coisa, não correu.
2 Por um ficheiro de registo. Acrescente ao fim do comando >> /home/utilizador/cron.log 2>&1 , trocando o caminho pelo seu. Passa a ter a saída e os erros guardados, com histórico, sem encher a caixa de correio.
3 Pela própria tarefa. Faça o script gravar a data e o resultado numa tabela ou num ficheiro. É a única prova de que ele não só arrancou como chegou ao fim.
4 Pelos Erros. Na secção Métricas do cPanel, os erros do PHP aparecem também quando quem corre o script é o cron e não um visitante.
Quando já confia nela, cale-a. Acrescentar >/dev/null 2>&1 ao fim do comando manda a saída para o lixo e deixa de lhe encher a caixa todos os dias. Faça isso depois de a ver correr, nunca antes: uma tarefa silenciosa que nunca funcionou é indistinguível de uma que funciona.
Os três enganos de sempre. Caminhos relativos (o cron não começa na pasta do seu site); o interpretador errado (a tarefa corre numa versão de PHP e o site noutra, e aí faltam extensões); e a hora do servidor, que pode não ser a sua. Sobre esta última, veja o artigo «A que horas está o servidor, e porque é que o PHP e o MySQL podem discordar».

Tem um script e não sabe montar a linha do cron? Mande-nos o script e o horário que quer.

Abrir um pedido de suporte

VEJA TAMBÉM

O que está incluído em cada plano

Até onde vai o nosso apoio: Política de Suporte

PRODUTO RECOMENDADO

Alojamento de sites com cPanel

Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde 600,00 MT/mês

Ver planos
  • 0 Utilizadores acharam útil
Esta resposta foi útil?