Tareas programadas en Laravel utilizando Cron

task-schedule

En nuestros proyectos aveces requerimos realizar tareas programadas y para ello normalmente utilizamos Cron, si ya hemos utilizado Cron fuera de Laravel lo normal es especificar en cada entrada el tiempo y el comando a ejecutar, pero el framework nos provee de “Task Scheduling” que nos facilita el trabajo y nos permite tenerlo ordenado y solo realizando un Cron entry.

Para empezar especifico que se utilizó la ultima versión de laravel hasta la fecha que es 5.5 si quieres ver sus novedades Click aquí.

Task Scheduling:

Este se encargará de tener todas nuestras tareas programadas es decir no crearemos una entrada Cron por cada tarea sino que solo crearemos ¡Una! entrada Cron de esta manera:

Esta se ejecutará cada minuto como le especificamos y ya el schedule se encargara del resto, la entrada deberá apuntar al artisan que normalmente se encuentra en la raíz de tu proyecto laravel.

Nota:

Si estas utilizando un servidor compartido y te permite poner entradas cron tal vez * * * * * php no sirva, prueba con  * * * * * php-cli.

 

Ahora simplemente tenemos que utilizar el componente que nos proporciona laravel y ya este se encargara de todas nuestras tareas, para utilizarlo solo debes definir todas las tareas que necesites en el método schedule del archivo app\Console\Kernel.php, por ejemplo:

En este caso utilizamos el schedule para llamar un Closure y dentro de este poner nuestra lógica, después ejecutamos daily() este método lo que hará es indicar que la lógica que vaya dentro del closure se ejecutara cada día, y así de simple ya tenemos nuestra tarea que se ejecutara cada día, también sencillamente cambiando el método a mondays() por ejemplo se ejecutara solo los lunes Click aquí para ver todas las opciones.

 

Ordenando las tareas:

Ya sabemos utilizarlo de la manera básica pero ¿que pasa si nuestra aplicación tiene muchas tareas?, que el método se volvería enorme ya que tendría toda la lógica de negocio dentro del método schedule() y seria muy engorroso. Para solucionar esto desde schedule nos permite ejecutar Commands y así tener la lógica en los comandos y simplemente el schedule los ejecuta. Para crear un Command ejecutamos:

con este comando artisan creamos un Command, todos los comandos creados irán dentro de  app\Console\Commands.

Dentro del archivo LogTest.php que acabamos de crear nos encontraremos con 3 puntos importantes:

  1.  Propiedad: $signature: el nombre del comando, es muy importante ya que con este nombre lo llamaremos desde el schedule.
  2. Propiedad: $description: simplemente es una descripción para decir que hace el comando
  3. Método: handle(): dentro de este pondremos la lógica que va a realizar.

 

Entendido esto al comando creado anterior lo dejaremos de esta manera:

Dándole nombre log:test lo llamare de este modo en mi método schedule de mi kernel:

De esta manera en el log de Laravel se escribirá Mi Comando Funciona! cada hora ya que es lo que realice en el método handle.

Y aquí termina este post si tienes alguna duda sugerencia o corrección puedes comentarlo debajo o unirte a nuestro Slack donde podrás resolver cualquier duda , cualquier feedback es bienvenido.

Documentación de Task Schedulinghttps://laravel.com/docs/5.5/scheduling

Comparte este artículo

Entra en la discusión y deja tu comentario

  • Guillermo Romo

    excelente el tutorial seria genial mirar uno con supervisor

Veces