Composant de tâches planifiées Crontab

Description

workerman/crontab est similaire au crontab Linux, à la différence qu'il prend en charge la planification à la seconde près.

Format du temps :

0   1   2   3   4   5
|   |   |   |   |   |
|   |   |   |   |   +------ day of week (0 - 6) (Sunday=0)
|   |   |   |   +------ month (1 - 12)
|   |   |   +-------- day of month (1 - 31)
|   |   +---------- hour (0 - 23)
|   +------------ min (0 - 59)
+-------------- sec (0-59)[optionnel ; si absent, la granularité minimale est la minute]

URL du projet

https://github.com/walkor/crontab

Installation

composer require workerman/crontab

Utilisation

Étape 1 : Créer le fichier de processus app/process/Task.php

<?php
namespace app\process;

use Workerman\Crontab\Crontab;

class Task
{
    public function onWorkerStart()
    {

        // Exécuter chaque seconde
        new Crontab('*/1 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Exécuter toutes les 5 secondes
        new Crontab('*/5 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Exécuter chaque minute
        new Crontab('0 */1 * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Exécuter toutes les 5 minutes
        new Crontab('0 */5 * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Exécuter à la première seconde de chaque minute
        new Crontab('1 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Exécuter à 7h50 chaque jour (la position des secondes est omise ici)
        new Crontab('50 7 * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

    }
}

Étape 2 : Configurer le processus pour démarrer avec webman

Ouvrir le fichier de configuration config/process.php et ajouter ce qui suit :

return [
    ....autre configuration omise....

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

Étape 3 : Redémarrer webman

Note : Les tâches planifiées ne s'exécutent pas immédiatement ; elles commencent à la minute suivante.

Remarques

Crontab n'est pas asynchrone. Exemple : un processus task configure deux timers A et B, tous deux exécutés chaque seconde. Si la tâche A prend 10 secondes, B doit attendre la fin de A avant de s'exécuter, ce qui retarde B.
Si la logique est sensible aux intervalles temporels, exécuter les tâches sensibles au temps dans des processus séparés pour éviter les interférences. Exemple pour config/process.php :

return [
    ....autre configuration omise....

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

Placer les tâches sensibles au temps dans process/Task1.php et les autres dans process/Task2.php.

Pour en savoir plus sur config/process.php, voir Processus personnalisés.