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
구성 설명은 사용자 정의 프로세스를 참조하십시오.