Componente de tarefas agendadas crontab

workerman/crontab

Descrição

workerman/crontab é semelhante ao crontab do Linux, a diferença é que o workerman/crontab suporta tarefas agendadas com precisão de segundos.

Explicação do tempo:

0    1    2    3    4    5
|    |    |    |    |    |
|    |    |    |    |    +------ dia da semana (0 - 6) (Domingo=0)
|    |    |    |    +------ mês (1 - 12)
|    |    |    +-------- dia do mês (1 - 31)
|    |    +---------- hora (0 - 23)
|    +------------ minuto (0 - 59)
+-------------- segundo (0-59) [pode ser omitido, se omitido, a menor unidade de tempo é o minuto]

Endereço do projeto

https://github.com/walkor/crontab

Instalação

composer require workerman/crontab

Uso

Passo 1: Criar o arquivo de processo process/Task.php

<?php
namespace process;

use Workerman\Crontab\Crontab;

class Task
{
    public function onWorkerStart()
    {

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

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

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

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

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

        // Executar às 7:50 diariamente, observação: o segundo foi omitido aqui
        new Crontab('50 7 * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

    }
}

Passo 2: Configurar o arquivo de processo para iniciar com o webman

Abra o arquivo de configuração config/process.php e adicione a seguinte configuração

return [
    ....outras configurações, omitidas aqui....

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

Passo 3: Reiniciar o webman

Observação: As tarefas agendadas não serão executadas imediatamente. Todas as tarefas agendadas serão iniciadas a cada minuto.

Explicação

O crontab não é assíncrono, por exemplo, em um processo de tarefa são configurados dois cronômetros, A e B, que executam uma tarefa a cada segundo. No entanto, se a tarefa A demorar 10 segundos para ser concluída, a tarefa B precisará esperar a conclusão de A antes de ser executada, causando um atraso na execução da tarefa B.
Se o negócio for sensível ao intervalo de tempo, as tarefas agendadas sensíveis ao tempo devem ser executadas em um processo separado para evitar a interferência de outras tarefas agendadas. Por exemplo, configure o arquivo config/process.php da seguinte maneira.

return [
    ....outras configurações, omitidas aqui....

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

Coloque as tarefas agendadas sensíveis ao tempo em process/Task1.php e as outras tarefas agendadas em process/Task2.php.

Mais

Para mais explicações sobre configuração em config/process.php, consulte Processo Personalizado.