crontab 정기 작업 컴포넌트

설명

workerman/crontab는 리눅스의 crontab과 유사하지만, 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: 프로세스 파일 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";
        });

    }
}

단계 2: 프로세스 파일을 webman 시작 시 구성

구성 파일 config/process.php를 열고 다음 구성을 추가합니다.

return [
    ....기타 구성, 여기 생략....

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

단계 3: webman 재시작

주의: 정기 작업은 즉시 실행되지 않으며, 모든 정기 작업은 다음 분 전까지 시간 측정이 시작되지 않습니다.

설명

crontab은 비동기적이지 않습니다. 예를 들어, 하나의 task 프로세스 내에서 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 구성 설명은 사용자 정의 프로세스를 참조하십시오.