[워드프레스] 17. 예약 : wp-cron 동작 원리와 예약 작업 (진짜 크론이 아니다)

워드프레스 해부 17편 - wp-cron 동작 원리와 예약 작업 (진짜 크론이 아니다)

작성자

카테고리:

* 이 게시물은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

(워드프레스 해부 ⑰) 예약

예약 발행, 자동 업데이트 확인, 플러그인 정기 작업 — 이런 걸 워드프레스에선 wp-cron이 담당한다. 그런데 이름과 달리 진짜 시스템 크론이 아니다. 이걸 모르면 “예약 글이 왜 제시간에 안 올라오지?”에서 막힌다.

wp-cron의 정체는 이렇다. 시간에 맞춰 스스로 도는 게 아니라, 누군가 사이트에 방문할 때 “혹시 지금 실행할 예약 작업 있나?”를 확인해서 돌린다. 그래서 트래픽이 없는 사이트는 예약 작업이 밀린다. 방문이 있어야 트리거되니까.

나도 이 시리즈를 예약 발행하면서 같은 문제를 겪었다. 트래픽이 적으면 예약 시각에 딱 안 올라올 수 있어서, 아예 진짜 시스템 크론(OS의 cron)이 주기적으로 wp-cron을 때리게 바꿨다. 방법은 두 단계다.

# 1) wp-config.php 에서 방문 기반 가짜 크론을 끈다
define( 'DISABLE_WP_CRON', true );

# 2) 시스템 크론(crontab)이 5분마다 wp-cron 을 직접 실행
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

이렇게 하면 방문자가 없어도 5분마다 정확히 예약 작업이 처리된다. 실제로 이 글도 그렇게 예약 시각에 자동 발행됐다.

직접 해보기

# 현재 예약된 작업 목록
$ wp cron event list

# 테스트 이벤트 예약 (10초 뒤 'my_hook' 실행 예약)
$ wp cron event schedule my_hook +10seconds

# 대기 중인 작업을 지금 강제 실행
$ wp cron event run --due-now

✅ 확인 — wp cron event list에 wp_scheduled_delete, wp_version_check 같은 코어 예약 작업들이 다음 실행 시각과 함께 뜨면 정상이다. 예약 발행한 글이 있다면 publish_future_post 관련 작업도 보인다.

왜 방문이 없으면 안 도나

wp-cron은 시간에 맞춰 스스로 도는 게 아니라, 페이지 요청이 들어올 때 “지금 실행할 예약 작업이 있나?”를 확인해서 돌린다. 그래서 트래픽이 거의 없는 사이트는 예약 글이 제시간에 안 올라가고 밀린다. 반대로 방문이 폭주하면 매 요청마다 확인하느라 오히려 부담이 되기도 한다. 이 ‘가짜 크론’ 성격을 알아야 예약 문제가 풀린다.

제대로 고치는 법 — 진짜 크론에 맡긴다

정확하게 돌리려면 wp-cron의 ‘방문 트리거’를 끄고, 서버의 진짜 크론이 주기적으로 wp-cron.php를 부르게 한다. 이게 예약 글을 제시간에 올리는 표준 처리다. 이 블로그도 이렇게 운영해서, 트래픽과 무관하게 예약이 정확히 나간다.

// 1) wp-config.php — 방문 트리거 끄기
define( 'DISABLE_WP_CRON', true );

# 2) 서버 crontab — 5분마다 실제로 실행
*/5 * * * * cd /var/www/site && wp cron event run --all >/dev/null 2>&1
# (또는) */5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null

예약 작업을 코드로 걸기

플러그인이 정기 작업을 걸 땐 wp_schedule_event로 반복 이벤트를 등록하고, 그 훅에 실제 함수를 연결한다. 한 번만 실행할 작업은 wp_schedule_single_event다.

if ( ! wp_next_scheduled( 'cozlab_daily' ) ) {
    wp_schedule_event( time(), 'daily', 'cozlab_daily' );   // 하루 한 번
}
add_action( 'cozlab_daily', function () {
    // 여기서 정기 작업 (정리·집계 등)
} );

지금 뭐가 예약돼 있는지 보기

무엇이 언제 돌기로 돼 있는지는 WP-CLI로 바로 확인한다. 밀린 게 있으면 강제로 실행해볼 수도 있다.

wp cron event list          # 예약된 작업과 다음 실행 시각
wp cron event run --all     # 지금 당장 전부 실행

예약이 밀릴 때 체크리스트

  • 트래픽 부족 — 위처럼 진짜 크론으로 넘기면 근본 해결.
  • DISABLE_WP_CRON은 껐는데 서버 크론을 안 걸어두지 않았나(그럼 아예 안 돈다).
  • 무거운 작업이 타임아웃으로 죽어 다음 작업까지 막고 있지 않나.
  • 서버 시간대가 사이트 설정과 어긋나 예약 시각이 밀려 보이지 않나.

wp-cron의 정체(방문 기반)만 이해하면, 예약이 밀리는 대부분의 상황은 ‘진짜 크론으로 넘기기’ 하나로 정리된다.

예약을 봤으니, 다음 편은 성능의 핵심 트랜지언트와 오브젝트 캐시 계층이다. 워드프레스가 같은 걸 두 번 계산하지 않는 방법.

자주 묻는 질문 (FAQ)

wp-cron은 진짜 크론인가요?

아닙니다. 방문이 있을 때 실행되는 의사(pseudo) 크론입니다. 방문이 없으면 예약 작업이 밀립니다.

예약 발행이 늦어져요.

트래픽이 적으면 wp-cron이 안 돌아 밀립니다. 서버의 진짜 크론으로 wp-cron.php를 주기 실행하면 정확해집니다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다