Componente de tareas programadas crontab

workerman/crontab

Descripción

workerman/crontab es similar al crontab de Linux, la diferencia es que workerman/crontab admite programación a nivel de segundos.

Explicación del tiempo:

0   1   2   3   4   5
|   |   |   |   |   |
|   |   |   |   |   +------ día de la semana (0 - 6) (Domingo=0)
|   |   |   |   +------ mes (1 - 12)
|   |   |   +-------- día del mes (1 - 31)
|   |   +---------- hora (0 - 23)
|   +------------ minuto (0 - 59)
+-------------- segundo (0-59)[Puede omitirse, si no hay 0, la granularidad de tiempo mínima es el minuto]

Dirección del proyecto

https://github.com/walkor/crontab

Instalación

composer require workerman/crontab

Uso

Paso 1: Crear el archivo de proceso process/Task.php

<?php
namespace process;

use Workerman\Crontab\Crontab;

class Task
{
    public function onWorkerStart()
    {

        // Ejecutar cada segundo
        new Crontab('*/1 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Ejecutar cada 5 segundos
        new Crontab('*/5 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Ejecutar cada minuto
        new Crontab('0 */1 * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Ejecutar cada 5 minutos
        new Crontab('0 */5 * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Ejecutar en el primer segundo de cada minuto
        new Crontab('1 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Ejecutar a las 7:50 todos los días, aquí se omite la posición de los segundos
        new Crontab('50 7 * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

    }
}

Paso 2: Configurar el archivo de proceso para iniciar junto con webman

Abrir el archivo de configuración config/process.php y agregar la siguiente configuración

return [
    ....otras configuraciones, omitidas por brevedad....

    'task'  => [
        'handler'  => process\Task::class
    ],
];

Paso 3: Reiniciar webman

Nota: Las tareas programadas no se ejecutarán de inmediato; comenzarán a ejecutarse en el próximo minuto.

Notas

El crontab no es asíncrono. Por ejemplo, si un proceso de tarea configura dos temporizadores, A y B, para ejecutarse cada segundo, pero la tarea A tarda 10 segundos en ejecutarse, entonces B tendrá que esperar a que A se complete antes de ejecutarse, lo que ocasionará un retraso en la ejecución de B.
Si el negocio es muy sensible al intervalo de tiempo, es necesario ejecutar las tareas programadas sensibles al tiempo en un proceso separado para evitar que sean afectadas por otras tareas programadas. Por ejemplo, en config/process.php se puede hacer la siguiente configuración

return [
    ....otras configuraciones, omitidas por brevedad....

    'task1'  => [
        'handler'  => process\Task1::class
    ],
    'task2'  => [
        'handler'  => process\Task2::class
    ],
];

Colocar las tareas programadas sensibles al tiempo en process/Task1.php y las demás tareas programadas en process/Task2.php.

Más

Para obtener más información sobre la configuración de config/process.php, consulte Proceso personalizado