Task Scheduler
codeigniter4/tasks — 클로저·커맨드·셸 스케줄 등록 및 수동 실행
운영 방법: cron에
* * * * * cd /path && php spark tasks:run >> /dev/null 2>&1을 등록하면
매분 실행되어 스케줄에 맞는 태스크가 자동으로 처리됩니다.
아래 ▶ 실행 버튼으로 태스크를 즉시 수동 실행할 수 있습니다.
등록된 태스크 (5개)
현재 시각:
| 이름 | 타입 | 액션 | 스케줄 | Cron 표현식 | 지금 실행? | |
|---|---|---|---|---|---|---|
health-check |
클로저 | 클로저 함수 | 매분 | * * * * * |
✓ 대기 중 | |
queue-monitor |
클로저 | 클로저 함수 | 5분마다 | */5 * * * * |
– | |
cache-clear |
Spark커맨드 | spark cache:clear | 00 * * * * | 00 * * * * |
– | |
daily-stats |
클로저 | 클로저 함수 | 매일 자정 | 0 0 * * * |
– | |
playground-reset |
Spark커맨드 | spark playground:reset --db-only --quiet | 00 3 * * * | 00 3 * * * |
– |
실행 결과
태스크 실행 버튼을 클릭하면 결과가 여기에 표시됩니다.
php spark tasks:list 출력 예시
+------------------+---------+---------------+--------------+ | Task | Type | Expression | Next Run | +------------------+---------+---------------+--------------+ | health-check | closure | * * * * * | (every min) | | queue-monitor | closure | */5 * * * * | (every 5min) | | cache-clear | command | 0 * * * * | (every hour) | | daily-stats | closure | 0 0 * * * | (midnight) | | playground-reset | command | 0 3 * * * | (3am daily) | +------------------+---------+---------------+--------------+
태스크 유형과 스케줄 메서드
클로저 closure
PHP 익명 함수를 직접 실행. 간단한 로직에 적합.
Spark 커맨드 command
php spark {name} 형태의 CLI 커맨드 실행.
셸 커맨드 shell
운영체제 셸 명령 실행. cp, rm 등 시스템 명령.
URL 호출 url
HTTP GET으로 지정 URL 호출. 웹훅·핑 용도.
큐 잡 푸시 queue
codeigniter4/queue 잡을 스케줄에 맞춰 자동 push.
app/Config/Tasks.php
<?php
namespace Config;
use CodeIgniter\Tasks\Config\Tasks as BaseTasks;
use CodeIgniter\Tasks\Scheduler;
class Tasks extends BaseTasks
{
public bool $logPerformance = false; // true 시 settings 테이블 필요
public int $maxLogsPerTask = 20;
public function init(Scheduler $schedule): void
{
// ① 클로저 태스크 — 매분 실행
$schedule->call(static function () {
$db = \Config\Database::connect();
$tables = count($db->listTables());
log_message('info', "[Task] 테이블 {$tables}개 정상");
return "DB 연결 정상 · 테이블 {$tables}개";
})->everyMinute()->named('health-check');
// ② 클로저 태스크 — 5분마다
$schedule->call(static function () {
$db = \Config\Database::connect();
$pending = $db->table('queue_jobs')->where('status', 0)->countAllResults();
return "대기 잡 {$pending}개";
})->everyFiveMinutes()->named('queue-monitor');
// ③ Spark 커맨드 — 매시간
$schedule->command('cache:clear')->hourly()->named('cache-clear');
// ④ 클로저 태스크 — 매일 자정
$schedule->call(static function () {
$posts = \Config\Database::connect()->table('posts')->countAllResults();
log_message('info', "[Task] 게시글 {$posts}개");
})->daily()->named('daily-stats');
// ⑤ 커맨드 + 환경 제한 — 매일 새벽 3시, production만
$schedule->command('playground:reset --db-only --quiet')
->daily('3:00 am')
->environments('production') // production 환경에서만 실행
->named('playground-reset');
}
}
주요 스케줄 메서드
| 메서드 | Cron | 설명 |
|---|---|---|
everyMinute() |
* * * * * |
매분 |
everyFiveMinutes() |
*/5 * * * * |
5분마다 |
everyFifteenMinutes() |
*/15 * * * * |
15분마다 |
hourly() |
0 * * * * |
매시간 정각 |
daily() |
0 0 * * * |
매일 자정 |
daily('3:00 am') |
0 3 * * * |
매일 새벽 3시 |
weekdays() |
0 0 * * 1-5 |
평일 자정 |
mondays() |
0 0 * * 1 |
매주 월요일 |
monthly() |
0 0 1 * * |
매월 1일 |
cron('*/10 * * * *') |
*/10 * * * * |
커스텀 표현식 |
고급 옵션
| 옵션 | 설명 |
|---|---|
->named('name') |
태스크 이름 지정. tasks:run --task=name 으로 단독 실행 가능 |
->environments('production') |
특정 CI_ENVIRONMENT에서만 실행 |
->singleInstance() |
동시 실행 방지 (잠금 파일 사용) |
->singleInstance(1800) |
TTL 1800초 잠금 |
특정 태스크만 실행
# 이름으로 단독 실행
php spark tasks:run --task=health-check
# 등록된 태스크 목록 조회
php spark tasks:list
# 태스크 실행 일시 중지 / 재개
php spark tasks:disable
php spark tasks:enable
Task Scheduler는 cron이 매분
php spark tasks:run을 실행해야
스케줄대로 동작합니다. 아래 한 줄만 등록하면 됩니다.
1. crontab 등록
# crontab 편집
crontab -e
# 아래 한 줄 추가
* * * * * cd /var/www/playground && php spark tasks:run >> /dev/null 2>&1
웹 서버 사용자(www-data)로 등록하려면:
sudo crontab -u www-data -e
2. 실행 로그 확인
# CI4 로그 파일 실시간 확인
tail -f writable/logs/log-2026-06-15.log
# tasks:run 결과만 필터링
grep "\[Task\]" writable/logs/log-2026-06-15.log
logPerformance = true로 설정하면 DB에 실행 시간·출력을 저장합니다.
(codeigniter4/settings 마이그레이션 필요)
전체 실행 흐름