Компонент для периодических задач в crontab

workerman/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

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

Шаг 1: Создание файла процесса process/Task.php

<?php
namespace 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";
        });

    }
}

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

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

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

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

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

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

Расшифровка

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

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

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

Сохраните чувствительные к времени периодические задачи в process/Task1.php, а остальные задачи в process/Task2.php.

Дополнительно

Для получения дополнительных настроек config/process.php, пожалуйста, обратитесь к Настройка процесса.