Компонент задач crontab

Описание

workerman/crontab похож на crontab в linux, но отличается тем, что workerman/crontab поддерживает планирование с точностью до секунд.

Описание времени:

0   1   2   3   4   5
|   |   |   |   |   |
|   |   |   |   |   +------ день недели (0 - 6) (воскресенье=0)
|   |   |   |   +------ месяц (1 - 12)
|   |   |   +-------- день месяца (1 - 31)
|   |   +---------- час (0 - 23)
|   +------------ минута (0 - 59)
+-------------- секунда (0-59)[можно опустить, если нет 0位, минимальная единица времени - минута]

Адрес проекта

https://github.com/walkor/crontab

Установка

composer require workerman/crontab

Использование

Шаг первый: Создайте файл процесса app/process/Task.php

<?php
namespace app\process;

use Workerman\Crontab\Crontab;

class Task
{
    public function onWorkerStart()
    {

        // Выполнять каждую секунду
        new Crontab('*/1 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Выполнять каждые 5 секунд
        new Crontab('*/5 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Выполнять каждую минуту
        new Crontab('0 */1 * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Выполнять каждые 5 минут
        new Crontab('0 */5 * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Выполнять в первую секунду каждой минуты
        new Crontab('1 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Выполнять в 7:50 каждый день, обратите внимание, что здесь опущены секунды
        new Crontab('50 7 * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

    }
}

Шаг второй: Настройте файл процесса для запуска с webman

Откройте конфигурационный файл config/process.php и добавьте следующую конфигурацию

return [
    ....другие конфигурации, здесь опущены....

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

Шаг третий: Перезапустите webman

Обратите внимание: задачи cron не будут выполняться немедленно, все задачи cron начнут отсчет времени только с наступлением следующей минуты.

Пояснение

crontab не является асинхронным. Например, если в одном процессе tasks настроены два таймера A и B, которые выполняют задачи каждую секунду, но задача A занимает 10 секунд, то задача B должна ждать завершения A, что приведет к задержке в выполнении B.
Если бизнес требует высокой точности по времени, рекомендуется размещать чувствительные к времени задачи cron в отдельных процессах, чтобы предотвратить влияние других задач cron. Например, настройте config/process.php следующим образом:

return [
    ....другие конфигурации, здесь опущены....

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

Поместите задачи cron, чувствительные к времени, в process/Task1.php, а другие задачи cron — в process/Task2.php.

Для получения более подробной информации о конфигурации config/process.php, смотрите Пользовательские процессы