Skip to content

How to create a cronjob with Laravel v6 to 8, deploy local and prod in real server.

License

Notifications You must be signed in to change notification settings

JonathanGrimaldo/cronjob-laravel

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 

Repository files navigation

CronJob Laravel v6, v7, v8

Como crear un cronJob para Laravel y no morir en el intento ⚠️ ⚠️

Crearemos un prueba local en Windows y posteriormente lo subiremos a un servidor Cpanel, si usas Linux los pasos son los mismos solo al final un comando se ejecuta diferente, (crontab -e) igual puedes ver las referencias visual al final tanto para Windows como para Linux.

Introducción:

1.- Configuraremos una clase comando donde definiremos un comando a ejecutar.

2.- Agregaremos al archivo Kernel el comando recien configurado para poderlo ejecutar.

3.- Como extra configuraremos su Cpanel Server donde agregaremos el cron para que se empiece a ejecutar automático.


El cronjob puede ser útil para enviar emails, notificaciones o ejecutar sentencias a tu base de datos, ya sea por un horario definido o un horario futuro.

Para esta ocasión crearé un comando que se encarga de borrar el cache diariamente a las 7:00am

Cron OK


Empecemos por crear una clase Comando

En ésta definiremos el nombre, descripción y las acciones que ejecutará el comando una vez lo llames

Ejecuta este comando en la terminal para crear una clase comando:

Aquí solo crearemos la clase donde empezaremos a definir el nombre, la descripción y el comando, yo le llamaré CacheClean a mi clase.

1.- php artisan make:command NombreDeTuLaClase //php artisan make:command CacheClean

Después de ejecutar lo anterior, creará un directorio Commands dentro de Console.

2

Abrimos el directorio Commands y seguido abres el archivo con el nombre de la clase, en mi caso CacheClean.php.

Dentro de la clase que acabamos de crear existen 2 variables protegidas la firma y la descripción:

En la firma pondras el nombre de tu comando, por ejemeplo send:notification ó en mi caso le pondre clean:cache.

Y en la descripción es algo breve acerca del comando, puedes visualizarlo más adelante ejecutando solo php artisan.

1.- protected $signature = 'clean:cache';

2.- protected $description = 'Clear all caches';

desca

Hasta aquí has concluido la firma/nombre del comando, continuemos para definir sus tareas a ejecutar.

3.- Adicional a estas variables agregaré una más que se encargará de guardar un log después de ejecutar el comando:

protected $message = '';

Como en mi caso usaré el Storage para guardar un log en un archivo de texto, para verificar que realmente esta ejecutandose el comando agregare el Facade de Storage y también el Facade Artisan porque utilizaré un comando nátivo de php; que es php artisan optimize:clear;

Al inicio agregue los Facades que usaré:

illuminate

Al final de esta clase existe una función llamada handle, aquí pondremos la lógica de lo que ejecutará, en está parte ustedes definirian su lógica según lo necesiten:

habdle

Hasta aquí ya hemos terminado de configurar, el nombre del comando, la descripción y las tareas que ejecutará, pasemos al archivo Kernel.php


Kernel: Llamemos el comando a ejecutar

Pasamos al archivo Kernel.php, (App/Console/Kernel.php) aquí llamaremos la clase que hemos creado antes

1.- En la variable $commands ingresa el nombre de tu clase:

cacheclen

¡Bien ya agregaste el comando a la linea de comandos php artisan!

2.- Lo siguiente es definir el horario en que el comando se ejecutará esto puede ser útil para probar de manera local, ya que en Cpanel no es necesario porque ahí configuras los horarios(en Cpanel), aquí en la Doc de laravel puedes ver las frecuencias ó horarios ya predifinidos: schedule-frequency-options;

schedule

Puede definir todas tus tareas programadas en la función schedule del App\Console\Kernel, es la encargada de realizarlo.


Hora de ejecutarlo

De manera local puedes probar php artisan: y verás que el comando que creaste ya esta en la lista.

Puedes ejecutarlo usando el comando de horario

php artisan schedule:run

ó llamarlo por su nombre:

php artisan clean:cache

clr

Si estas usando Laravel 8, puedes ejecutar php artisan schedule:list y ver una lista de los comandos que has creado.

Y si quieres que trabaje de forma local en automático con Laravel 8 ejecuta php artisan:work y estara trabajando en 2do plano de forma auto.

Esos comandos solo estan disponibles en Laravel 8 en 7 e inferior solo tenemos php artisan schedule:run pero es suficiente.

¡Seguimos! comprobaré en mi archivo.txt si se ejecutó el comando que mencioné antes:

okaa


Cpanel configuración

Lo siguiente es crear un cronjob en Cpanel, solo configuraremos el horario, solo eso;

cronpanel

Aparece una vista con Cron Email

Ahí es opcional ingresar un email, cuando se ejecute la tarea te enviará un correo a modo de notificación.


Agregar trabajo cron

Aqui definiremos el horario en que se ejecutará de manera automática.

En mi caso lo definiré a las 7:00 am todos los días:

config1

En la parte de mando es importante definir la ruta de su proyecto, pueden tomar de ejemplo la siguiente linea, de igual forma se encuentra en el mismo cPanel en la parte de arriba :

/usr/local/bin/php /home/hostserver/public_html/path/to/cron/script

En mi caso solo necesito que pueda ver la carpeta App

/usr/local/bin/php /home/myhost/ && php artisan schedule:run >> /dev/null 2>&1

1.- La linea anterior se resume en ruta /usr/local/bin/php /home/myhost/,

2.- Ejecutar el comando && php artisan schedule:run.

3.- Y si existe un correo a enviar notificación /dev/null de lo contrario se queda null.

4.- Finalmente una condición verdadera para correr el comando si ó si: 2>&1.

cronjobokaaa

Y listo ya tienes el cron listo trabajando en automático, si quieres verificar que funciona ejecuta php artisan schedule:run ó php artisan elnombre:detucomando en la terminal;

Y ya habrá quedado;

Cron OK

Listo hasta aquí concluye!! 🧑 😎

Referencias visuales en YT:

Las diferencias más notorias entre Win y Linux son ejecutar este comando al final:

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Linux: https://www.youtube.com/watch?v=OVr6K3Lr3DY&t=395s

Windows: https://www.youtube.com/watch?v=0uG0B5HqiuA

Docu de Laravel: https://laravel.com/docs/8.x/scheduling

Laravel jobs: configuracion de colas y jobs:

https://onlinecode.org/laravel-7-send-bulk-mail-in-background-using-queue/

https://dokov.bg/laravel-loves-cpanel

About

How to create a cronjob with Laravel v6 to 8, deploy local and prod in real server.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published