Componente de Tarefa Cron (crontab)

Descrição

workerman/crontab é semelhante ao crontab do linux, com a diferença de que workerman/crontab suporta agendamentos em nível de segundos.

Descriçã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)
|   +------------ min (0 - 59)
+-------------- sec (0-59)[pode ser omitido, se não houver o campo de segundos, a menor granularidade é em minutos]

Endereço do Projeto

https://github.com/walkor/crontab

Instalação

composer require workerman/crontab

Uso

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

<?php
namespace app\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 na primeira segunda de cada minuto
        new Crontab('1 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Executar todos os dias às 7:50, note que aqui o campo de segundos foi omitido
        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, aqui omitido....

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

Passo 3: Reiniciar o webman

Atenção: as tarefas agendadas não serão executadas imediatamente, todas as tarefas agendadas começarão a contar apenas no próximo minuto.

Observação

O crontab não é assíncrono, por exemplo, se um processo de tarefa configurar dois temporizadores A e B, ambos executando a cada segundo, mas a tarefa A demora 10 segundos, então a tarefa B precisará esperar a conclusão da tarefa A para ser executada, causando um atraso na execução de B.
Se o negócio é sensível ao intervalo de tempo, é necessário colocar tarefas agendadas sensíveis em um processo separado para evitar que sejam afetadas por outras tarefas agendadas. Por exemplo, no config/process.php faça a seguinte configuração

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

    '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.

Para mais informações sobre a configuração do config/process.php, consulte Processos Personalizados