DEV Community

loading...

Gerenciando Tarefas Agendadas do Laravel no Banco de Dados

Pedro Paulo Silva
・3 min read

Tarefas agendadas são uma ótima maneira de executar processos repetitivos de maneira automatizada em nossos projetos, basta definir as tarefas e escolher os momentos em que elas serão executadas e pronto, pode deixar o resto do trabalho com o cron do servidor.

Geralmente essa definição dos momentos em que as tarefas irão rodar fica dentro do projeto e acaba sendo suficiente em muitos casos, porém, essa maneira de gerenciamento acaba sendo um empecílio quando se precisa alterar o horário em que as tarefas serão executadas. Gerenciando dessa maneira, será necessário uma alteração no arquivo, e uma nova release do projeto para as alterações terem efeito. Isso também restringe que o ajuste no horário da tarefa seja feito somente por um desenvolvedor.

Para resolver esse problema, podemos gerenciar as tarefas agendadas no banco de dados, fazendo com que apenas a alteração de um registro já altere o funcionamento da tarefa.

No Laravel temos o pacote: Laravel Database Schedule, que permite o gerenciamento das tarefas no banco de dados e ainda fornece uma interface para que a alteração das tarefas possa ser feita de maneira mais simples e por alguém sem tanto conhecimento de programação.

Instalação

Para instalar a biblioteca vamos rodar:

composer require robersonfaria/laravel-database-schedule
Enter fullscreen mode Exit fullscreen mode

Após a instalação precisamos rodar as migrations para criar as tabelas usadas pela biblioteca:

php artisan migrate
Enter fullscreen mode Exit fullscreen mode

Por último, exportar o arquivo de configurações:

php artisan vendor:publish --provider="RobersonFaria\DatabaseSchedule\DatabaseSchedulingServiceProvider" --tag="config"
Enter fullscreen mode Exit fullscreen mode

No arquivo de configurações vamos alterar o restricted_access para false para o teste.

alt text

OBS: essa configuração deixa o dashboard de tarefas agendadas público, para restringir o acesso somente à usuários autorizados deixe a propriedade como false e consulte a documentação para definir quem poderá acessar.

Criando a Tarefa Agendada

Para exemplo vamos criar uma tarefa rodando:

php artisan make:command NovoComando
Enter fullscreen mode Exit fullscreen mode

E configuramos o comando dessa maneira:

protected $signature = 'comando:novo-comando';

protected $description = 'Novo comando teste';

public function handle(): int
{
    $this->info('Comando rodando!');
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

Normalmente, agora seria o momento em que iríamos cadastrar esse comando que criamos, no Kernel.php e configurariamos o horário para a tarefa rodar, mas usando o database schedule não faremos isso.

Agendando a Tarefa no Banco de Dados

Após iniciar o servidor com:

php artisan serve
Enter fullscreen mode Exit fullscreen mode

Vamos acessar http://localhost:8000/schedule para entrar no dashboard.

alt text

No formulário, vamos escolher o comando que queremos agendar, a expressão cron que vai definir quando ocorrerá a execução e marcar a opção de envio de email caso ocorra uma falha na execução, para isso também vamos definir um email.

alt text

Para entender todas as opções e parâmetros que podem ser configurados na tarefa agendada visite a documentação.

Após essa configuração podemos ver no dashboard nosso comando cadastrado.

alt text

Executando as tarefas agendadas

Para testar localmente vamos rodar o comando:

php artisan schedule:run
Enter fullscreen mode Exit fullscreen mode

E depois do comando rodar, se acessarmos o email cadastrado e a sessão de Histórico no dashboard veremos o resutado.

alt text

alt text

Caso ocorra algum erro, o email e histórico continuam sendo registrados.

alt text

alt text

Referências

https://github.com/robersonfaria/laravel-database-schedule

Discussion (3)

Collapse
moreiraandre profile image
André Moreira

Show! Muito top.

Collapse
insign profile image
Hélio

Muito importante, eu tenho um Cron crucial mas que fica meio obscuro de saber o que tá acontecendo. Vou implementar.

Collapse
pedropms profile image
Pedro Paulo Silva Author

Simm, exatamente nesses casos que é interessante o uso, da pra acompanhar o que aconteceu em cada rotina e gerenciar elas bem mais facilmente!