본문으로 건너뛰기

WP-Cron 대체

Queuety은 내장 WordPress cron 시스템을 대체할 수 있습니다. 활성화하면 wp_schedule_event() 호출을 가로채 기본 WP-Cron 방식 대신 Queuety의 스케줄러를 통해 라우팅합니다. 이벤트는 사이트 트래픽과 독립적으로 실행되는 Queuety 워커가 처리하도록 설계되었습니다.

현재 제한 사항: 브리지는 Queuety 일정을 생성하지만, 워커에는 이 일정이 생성하는 __queuety_cron_{hook} 작업을 처리할 핸들러가 없어 원래 WordPress 콜백이 실행되지 않습니다. 각 작업은 실패한 뒤 지연 시간을 두고 재시도되며, 결국 묻힙니다(#9). 이 문제가 해결될 때까지 cron 이벤트를 실행해야 하는 사이트에서는 브리지를 활성화하지 마세요.

대체 기능 활성화

플러그인이나 테마 초기화 초기에 Queuety::replace_wp_cron()을 호출하세요.

PHP
use Queuety\Queuety;

Queuety::replace_wp_cron();

일반적으로 플러그인의 기본 파일이나 plugins_loaded 훅에서 호출합니다. WordPress이 로드된 상태에서 호출해야 합니다(플러그인이 활성화되어 있어야 함).

가로채는 항목

cron 브리지는 세 가지 WordPress 필터에 연결됩니다.

WordPress 함수 연결된 필터 동작
wp_schedule_event() pre_schedule_event 같은 간격으로 Queuety 일정을 생성합니다
wp_unschedule_event() pre_unschedule_event 해당 Queuety 일정을 제거합니다
wp_get_scheduled_event() pre_get_scheduled_event Queuety에서 일정 데이터를 반환합니다

schedule 속성이 있는 이벤트(예: hourly, twicedaily, daily)처럼 반복되는 이벤트만 가로챕니다. wp_schedule_single_event()로 예약한 단발성 이벤트는 가로채지 않습니다.

이벤트 매핑 방식

플러그인이 wp_schedule_event()을 호출하면 Queuety은 wp_get_schedules()를 통해 일정 이름을 확인하고, 핸들러 이름이 __queuety_cron_{hook}인 Queuety 일정을 생성한 뒤 원래 WordPress 훅 이름과 인수를 일정 페이로드에 저장합니다.

의도된 동작은 Queuety 워커가 예약된 작업을 처리할 때 원래 훅 이름과 인수를 사용해 do_action()을 호출하고, Queuety이 실행 시점을 관리하면서 기존 WordPress 콜백을 실행하는 것입니다. CronBridge::process_cron_event()에는 해당 호출이 구현되어 있지만 아직 호출하는 곳은 없습니다(위 제한 사항 참조). 일정은 장기 실행 wp queuety work 프로세스에서만 평가되며, 약 1분에 한 번 실행됩니다(스케줄링 참조).

간격 확인

브리지는 먼저 wp_get_schedules()을 통해 일정 이름을 확인한 다음 기본 제공 기본값을 사용합니다.

일정 이름 간격
hourly 3,600초
twicedaily 43,200초
daily 86,400초
weekly 604,800초

cron_schedules 필터로 등록한 사용자 지정 일정 간격은 wp_get_schedules()이 해당 값을 반환하는 한 지원됩니다.

WP-Cron 복원

기본 WordPress cron 시스템으로 되돌리려면 다음을 실행하세요.

PHP
Queuety::restore_wp_cron();

이렇게 하면 필터 훅이 제거되고 WordPress이 내장 방식으로 cron 이벤트를 다시 처리합니다. 브리지를 설치할 때 DISABLE_WP_CRON은 true으로 정의되며 런타임에 정의를 해제할 수 없으므로, wp-config.php에서 해당 상수를 제거하거나 프로세스를 다시 시작해야 할 수 있습니다.

사용 시점

사이트 트래픽이 적거나 WP-Cron보다 더 안정적인 실행 시점이 필요하거나, 이미 Queuety 워커를 실행하고 cron 실행도 같은 운영 시스템에서 처리하려는 경우 이 대체 기능이 유용합니다. 중앙 집중식 관측 가능성이 중요할 때도 도움이 됩니다. cron 이벤트가 다른 대기열 작업과 같은 로그 및 메트릭에 표시되기 때문입니다.

제한 사항

몇 가지 중요한 제약이 있습니다. 예약된 이벤트를 실행하려면 Queuety 워커가 실행 중이어야 합니다. 반복 일정만 가로채며 wp_schedule_single_event()으로 생성한 단발성 이벤트는 브리지 밖에 그대로 남습니다. replace_wp_cron()도 현재 PHP 프로세스가 실행되는 동안 DISABLE_WP_CRON을 정의하므로, restore_wp_cron()은 훅을 제거하지만 상수 정의를 해제할 수 없습니다. 마지막으로 브리지는 WordPress이 로드된 경우에만 작동합니다. WordPress 필터와 do_action()에 의존하기 때문입니다.

예시: 전체 설정

PHP
use Queuety\Queuety;

// In your plugin's main file.
add_action( 'plugins_loaded', function () {
    Queuety::replace_wp_cron();
} );

여기서는 Queuety::init()을 호출할 필요가 없습니다. 활성화된 Queuety 플러그인이 WordPress 데이터베이스 인증 정보를 사용해 연결을 만들고 plugins_loaded에서 자체적으로 초기화됩니다. replace_wp_cron()는 필터만 설치하므로 해당 초기화가 먼저 이루어질 필요가 없습니다.

이후 플러그인이 wp_schedule_event()으로 등록하는 반복 이벤트는 Queuety 일정으로 저장됩니다. #9 문제가 해결될 때까지 콜백은 실행되지 않습니다.