Breaking

Post Top Ad

Your Ad Spot

martes, 7 de mayo de 2019

Consejos para usar el programador de Laravel

Las funciones de programación de tareasde Laravel están bien documentadas y le brindan todo el poder de cron en una API fluida. La documentación cubre la mayor parte de lo que necesita para comenzar a trabajar con el programador rápidamente, sin embargo, hay algunos conceptos subyacentes que me gustaría cubrir relacionados con cron que ayudarán a consolidar su comprensión de cómo Laravel determina qué tareas programadas deben ejecutarse. .

Entendiendo Cron

En la base del programador de Laravel, debe comprender cómo programar tareas en un servidor a través de la sintaxis algo confusa de Cron.
Antes de profundizar en la comprensión de cron y los recursos que puede utilizar para familiarizarse con cron, echemos un vistazo a las piezas esenciales del programador.
Primero, define las tareas programadas a través del App\Console\Kernel::schedule()método de su aplicación Laravel :
/**
 * Define the application's command schedule.
 *
 * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
 * @return void
 */
protected function schedule(Schedule $schedule)
{
    // $schedule->command('inspire')
    //         ->hourly();
}
Puede usar este método para definir todas las tareas programadas que deben ejecutarse. El Schedulemétodo de instancia command()devuelve una instancia de la Illuminate\Console\Scheduling\Eventclase.
Si desea jugar / depurar con una instancia de la clase de evento, puede volcar como el siguiente ejemplo:
$event = $schedule->command('inspire')
                  ->hourly();

dd($event->expression); // "0 * * * *"
Para activar este método, ejecute artesano:
> php artisan
"0 * * * *"
La instancia de evento tiene una expressionpropiedad que almacena la representación cron de la tarea después de las llamadas de API fluidas.
Tenga en cuenta el valor de este ejemplo mientras hablamos de cron.
Laravel lo protege de cron con la API fluida del programador, en nuestro ejemplo, el hourly()método, pero entender a cron lo ayudará a comprender mejor cómo solucionar los problemas que ocurren debajo del capó.
Aquí hay una representación de texto que debería aclarar cómo funciona cron si no está familiarizado (incluso si lo está, apuesto a que esto todavía es útil):
# Use the hash sign to prefix a comment
# +---------------- minute (0 - 59)
# |  +------------- hour (0 - 23)
# |  |  +---------- day of month (1 - 31)
# |  |  |  +------- month (1 - 12)
# |  |  |  |  +---- day of week (0 - 7) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *  command to be executed
#-----------------------------------------------------------
Utilizando el ejemplo anterior de "0 * * * *", esta tarea se ejecutará en la marca de cero minutos cada hora de cada día de cada mes, todos los días de la semana.
Cron también tiene algunos otros formatos que pueden parecer extraños, como la expresión generada usando el quarterly()método de Laravel :
0 0 1 1-12/3 *
Ejecutar una tarea trimestralmente significa que se ejecutará a las 00:00 del primer día del mes en cada tercer mes de enero a diciembre. La 1-12/3sintaxis extraña se denomina "valor escalonado" y se puede utilizar junto con los rangos. La página del manual crontab - Linuxdescribe los valores de los pasos de la siguiente manera:
Los valores de paso se pueden utilizar junto con los rangos. Siguiendo un rango con “”Especifica saltos del valor del número a través del rango. Por ejemplo, "0-23 / 2" se puede usar en el campo de las horas para especificar la ejecución del comando cada dos horas (la alternativa en el estándar V7 es "0,2,4,6,8,10,12,14, 16,18,20,22 ”). Los pasos también se permiten después de un asterisco, así que si quiere decir "cada dos horas", simplemente use "* / 2".
Le animo a leer la página del manual, o al menos tenerla a mano si se encuentra en una situación en la que necesita comprender mejor el cronograma subyacente para una tarea.

Entendiendo la API de eventos de programación

Laravel tiene algunas excelentes APIs fluidas que le permiten encadenar múltiples llamadas de métodos. La Eventclase de programación no es diferente. Sin embargo, hay algunos matices con algunas de las combinaciones que podrías usar.
Tome el siguiente ejemplo para ilustrarlo mejor: digamos que queremos que un comando se ejecute cada hora, pero solo los lunes, miércoles y viernes:
$schedule->command('inspire')
         ->hourly()
         ->mondays()
         ->wednesdays()
         ->fridays();
Podría pensar que el comando anterior logra el cron correcto, pero no es así como funciona. En el ejemplo anterior, el último método llamado "día" es fridays(), por lo tanto, aquí está el aspecto del cron:
0 * * * 5
La tarea anterior se ejecutará cada hora, pero solo el viernes.
Antes de mostrarle el método correcto, llame para lograr lo que queremos, veamos el Event::fridays()método. El fridays()método (y muchos otros) proviene del rasgo de Frecuencias de Manages de Laravel :
/**
 * Schedule the event to run only on Fridays.
 *
 * @return $this
 */
public function fridays()
{
    return $this->days(5);
}
El método llama a otro método en el mismo rasgo days()que se parece a lo siguiente al momento de escribir:
/**
 * Set the days of the week the command should run on.
 *
 * @param  array|mixed  $days
 * @return $this
 */
public function days($days)
{
    $days = is_array($days) ? $days : func_get_args();

    return $this->spliceIntoPosition(5, implode(',', $days));
}
Puedes ver los detalles de cómo spliceIntoPosition()funciona, pero todos los métodos de "día" se sobrescriben, por lo que el último llamado palos.
Así es como escribirías el horario correcto usando la API fluida de Laravel:
$schedule->command('inspire')
         ->hourly()
         ->days([1, 3, 5]);
La depuración de esta instancia de tarea produce la siguiente expresión:
0 * * * 1,3,5
¡Bingo!

Usando Cron Directamente

La mayoría del tiempo creo que la mayoría de la gente prefiere usar la API fluida de Laravel. Sin embargo, la Eventtarea incluye un cron()método para establecer la expresión directamente:
$schedule->command('inspire')
         ->cron('0 * * * 1,3,5');
Argumentaría que la API fluida de Laravel es una forma más legible de definir el comando, pero puede obtener todo el poder de cron directamente con este método si prefiere usar la sintaxis cron.

Crontab Guru

Para casos de uso avanzados y una mejor comprensión de cómo se ejecutarán las tareas programadas, considere la posibilidad de depurar la expresión cron subyacente y usar una herramienta como crontab.guru: el editor de expresiones de programación cron .

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas