IntroducaoEm 2010, escrevi o artigo Tarefas agendadas via Cron + PHP, que ensinava o basico sobre como montar um script de cron e configura-lo para que fosse executado com certa periodicidade automaticamente. Hoje, quase 6 anos depois, revolvi escrever mais um artigo sobre o assunto, mas desta vez para compartilhar algumas licoes valiosissimas que devem ser levadas em conta ao se preparar um script de cron.Observacao: as dicas apresentadas neste artigo tambem valem para a construcao de servicos (daemons) em PHP.O tempo de execucaoE comum scripts de cron processarem grandes volumes de dados e, portanto, levarem muito tempo para serem executados, especialmente se comparada a execucao de um script convencional de uma pagina web. Por este motivo, e preciso estar atento se o script esta preparado para permanecer a execucao mesmo apos um longo periodo.No PHP, existe a diretiva de configuracao max_execution_time, que possui valor "30" (segundos) por padrao para execucao web, mas possui valor "0" (zero) para execucao em php-cli, ou seja, no terminal. O valor "0" indica que o script podera ser executado por tempo indeterminado sem ser interrompido.Portanto, por padrao, nao e necessario ajustar o valor dessa diretiva nos scripts php-cli, porem, sabemos que existem alguns frameworks que podem forcar algum tempo limite. Entao para garantir que o script rode por tempo indeterminado, usamos a funcao set_time_limit passando o valor "0" por parametro, logo no inicio da execucao do script cron.A quantidade de memoria usadaNormalmente scripts de cron possuem um loop principal onde e realizada alguma operacao para um determinado conjunto. Por exemplo, consultar uma lista em um Banco de Dados e, para cada item consultado, realizar alguma operacao sobre ele. Este formato de script costuma ter algumas caracteristicas que podem causar o estouro de memoria, tais como: A quantidade de dados consultada da fonte (Banco de Dados) e muito grande. O loop principal realiza alguma operacao que popula um array e, portanto, a cada nova iteracao e necessario mais consumo de memoria. O loop principal constroi um log dinamicamente concatenando em uma string, para so no final guardar em um arquivo, causando o acumulo de memoria durante cada iteracao.Bem, se voce tem duvidas se seu script de cron esta consumindo cada vez mais memoria a cada iteracao do loop, voce pode realizar alguns experimentos de depuracao relativamente simples. Basta usar a funcao memory_get_usage em pontos estrategicos para obter a quantidade de memoria usada naquele momento. Veja o exemplo:<?php// Depurar quanto de memoria foi necessario para iniciar o PHPprintf("%0.2f MB\n", memory_get_usage() / 1048576);// Consultando itens para serem processados pelo cron...// Depurar quanto de memoria foi necessario para guardar os itens consultadosprintf("Consulta: %0.2f MB\n", memory_get_usage() / 1048576);foreach ($itens as $item) { // Realizar a operacao sobre o item percorrido ... // Depurar quanto de memoria esta sendo consumida ao percorrer o item printf("Loop: %0.2f MB\n", memory_get_usage() / 1048576);}// Depurar qual foi o pico de memoria ao longo da execucao do scriptprintf("Pico: %0.2f MB\n", memory_get_peak_usage() / 1048576);Algumas dicas de como evitar o uso excessivo de memoria: Cogitar a possibilidade de utilizar unbuffered query ao realizar a busca principal do script. Para