Componente di attività programmata crontab

Descrizione

workerman/crontab è simile al crontab di linux, con la differenza che workerman/crontab supporta la programmazione a livello di secondo.

Descrizione del tempo:

0   1   2   3   4   5
|   |   |   |   |   |
|   |   |   |   |   +------ giorno della settimana (0 - 6) (Domenica=0)
|   |   |   |   +------ mese (1 - 12)
|   |   |   +-------- giorno del mese (1 - 31)
|   |   +---------- ora (0 - 23)
|   +------------ min (0 - 59)
+-------------- sec (0-59) [facoltativo, se non specificato, la granularità minima del tempo è il minuto]

Indirizzo del progetto

https://github.com/walkor/crontab

Installazione

composer require workerman/crontab

Utilizzo

Passo 1: crea il file di processo app/process/Task.php

<?php
namespace app\process;

use Workerman\Crontab\Crontab;

class Task
{
    public function onWorkerStart()
    {

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

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

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

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

        // Esegui al primo secondo di ogni minuto
        new Crontab('1 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Esegui ogni giorno alle 7:50, nota che qui è stata omessa la posizione dei secondi
        new Crontab('50 7 * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

    }
}

Passo 2: configura il file di processo per avviarsi con webman

Apri il file di configurazione config/process.php e aggiungi la seguente configurazione

return [
    ....altre configurazioni, qui omesse....

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

Passo 3: riavvia webman

Nota: le attività programmate non verranno eseguite immediatamente, tutte le attività programmate inizieranno a contare a partire dal minuto successivo.

Spiegazione

Il crontab non è asincrono, ad esempio se in un processo task vengono impostati due timer, A e B, entrambi eseguono un'attività ogni secondo, ma se l'attività A richiede 10 secondi, allora B deve aspettare che A sia completata prima di essere eseguita, il che porta a ritardi nell'esecuzione di B.
Se l'intervallo di tempo è molto critico per l'attività, è necessario eseguire le attività programmate sensibili in processi separati per evitare di essere influenzati da altre attività programmate. Ad esempio, configura config/process.php come segue

return [
    ....altre configurazioni, qui omesse....

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

Posiziona le attività programmate sensibili al tempo in process/Task1.php e le altre attività programmate in process/Task2.php.

Per maggiori informazioni sulla configurazione di config/process.php, fai riferimento a Processi personalizzati