Si te encuentras trabajando en una aplicación de tamaño mediano o grande, es muy posible que necesites ejecutar tareas o bloques de código de manera programada y a intervalos regulares, como enviar correos a tus usuarios cuando sus membresías se encuentren a punto de expirar, o cancelar las cuentas de usuarios que no hayan renovado sus subscripciones.

Hacer esto a nivel de servidor usando cron jobs es un poco tedioso ya que su sintaxis no es la más amigable. Afortunadamente el framework Laravel cuenta con un componente para programar tareas de manera muy eficiente. En el siguiente videotutorial aprenderás cómo utilizar el componente de Schedule con la nueva sintaxis disponible a partir de Laravel 11.

Esta lección incluye un video premium

Regístrate para ver este video y cientos de lecciones exclusivas.

Este componente Laravel nos permite programar tareas de forma muy sencilla con una interfaz orientada a objetos en PHP, la cual nos resultará más familiar.

Laravel 10

En versiones previas contábamos con un archivo llamado Kernel.php ubicado en el directorio /app/Console/. Dentro de este archivo disponíamos de una clase que incluía un método llamado schedule() donde podíamos configurar la frecuencia con la que se ejecutarían ciertas tareas programadas.

Si actualizas tu proyecto a Laravel 11 desde una versión anterior, el archivo Kernel.php permanecerá ubicado en este mismo directorio.

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * Define the application's command schedule.
     */
    protected function schedule(Schedule $schedule): void
    {
        $schedule->command('model:prune')->hourly();
    }

    /**
     * Register the commands for the application.
     */
    protected function commands(): void
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

En este ejemplo, configuramos que el comando 'model:prune' para que se ejecute de manera programada, con una frecuencia de 1 vez cada hora.

Laravel 11

En esta versión el proceso es un poco diferente:

Creación de comandos

Si vamos a un proyecto que hayamos creado en Laravel 11 desde cero, encontraremos que ya no existe el archivo Kernel.php, de hecho, ahora ni siquiera disponemos del directorio /app/Console/ por defecto. Sin embargo podemos generarlo automáticamente al crear un nuevo comando personalizado con Artisan:

php artisan make:command LogTimeCommand

Esto generará un nuevo archivo de comandos llamado LogTimeCommand junto con la estructura de directorio /app/Console/Commands/ que lo contiene.

Ya que Laravel 11 incluye una estructura minimalista comparada con versiones anteriores, es posible que no encontremos algunos directorios con los que ya estábamos acostumbrados a trabajar, si realizamos una nueva instalación. Pero podemos ir agregando los componentes necesarios a medida que trabajamos según las necesidades de cada proyecto.

Ahora editaremos un poco el archivo, podemos configurar las acciones que queremos realizar dentro del método handle(), en este caso configuraremos el comando para que genere una entrada de log con la hora actual al ser ejecutado:

Si tu IDE no lo hace por ti. Recuerda que necesitas importar el Facade Log al principio de la clase.

<?php
namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class LogTimeCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'log-time';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Log the current time';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        // Tareas a ser ejecutadas por el comando
        Log::info('The current time is: '.now());
    }
}

Una vez más, podemos comprobar que el comando funcione por medio de Artisan, la variable $signature corresponde al nombre con el que Artisan identificara el comando:

php artisan log-time

Con este comando Artisan generará una nueva línea que contiene la fecha actual dentro del archivo laravel.log en el directorio /storage/logs/.

Programando tareas nuevas

A partir de esta versión de Laravel 11 programaremos nuestras tareas desde el archivo console.php dentro del directorio /routes/, para ello nos dirigiremos al archivo y haremos uso del nuevo facade Schedule, con el cual podemos llamar a diferentes métodos, como por ejemplo el método command(), al que podemos pasar como argumento un comando y especificar la frecuencia con la que se ejecutará el comando elegido.

<?php

use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;

// Facade Schedule
use Illuminate\Support\Facades\Schedule;

/*
Artisan::command('inspire', function () {
    $this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote')->hourly();
*/

// El facade Schedule nos permite programar la ejecución de comandos
Schedule::command('log-time')->everyMinute();

Ahora, solo necesitamos ejecutar el siguiente comando para que Laravel procese los cambios y comience a ejecutar las tareas programadas, en este caso cada minuto.

php artisan schedule:work

Schedule también nos permite crear directamente un comando «en línea» mediante el método call() al que pasaremos una función anónima donde definiremos nuestro comando, a este método le añadiremos el parámetro para indicar la frecuencia de la llamada, al igual que hicimos con el método anterior:

Schedule::call(function() {

  // Tarea a ejecutar declarada directamente en el método
  Log::info("The current time is: ".now());

})->everyMinute();

También es posible programar la ejecución de jobs como tareas programadas usando el método job().

Lista de tareas programadas

Puedes ver una lista de las tareas programadas en tu aplicación si ejecutas el siguiente comando Artisan:

php artisan schedule:list

Este comando generará una lista de todas las tareas que se encuentren activas o en cola de ejecución dentro de Laravel.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Manejo de excepciones en Laravel 11 Lección siguiente Opciones de instalación en Laravel 11