안녕하세요. 린치핀소프트 한광희입니다.

 

이번 포스트는 “워드프레스 예약 스케줄 작업 추가하기( WordPress Cron 사용하기!)” 를 소개합니다.

 

워드프레스를 운영하다 보면 주기적인 데이터 백업, 특정 시스템 로그 수집, 테마&플러그인 유지보수를 해야 할때가 있습니다.

예를 들어 1주일 마다 데이터베이스를 백업한다든가, 현재 워드프레스에 등록된 포스트의 수나 방문자통계를 관리자 이메일로 자동 발신한다거나 하는 등의 주기적인 “작업”이 필요합니다.

이 작업을 그때그때마다 관리자가 직접하면 굉장히 번거롭기도 하고, 조작간에 실수가 발생하면 시스템이 오작동되어 수리에 추가적인 비용이 발생할 수도 있습니다. 이때, 오늘 설명드릴 예약작업(Cron Job)을 통해 주기마다 수행되어야 하는 작업을 예약하여 시스템이 자동적으로 수행할수 있도록 구성 할 수 있습니다.

단, 오늘 소개 해드리는 포스트는 Unix의 Crontab 을 활용하므로 Unix OS 시스템에 약간의 경험을 가지신분들에게 유용할 것입니다.

워드프레스 시스템에서는 테마와 플러그인에서 예약한 스케줄과 별개로 기본적으로 워드프레스 코어에서  주기적인 예약된 작업을 수행하고 있습니다.

보통, 테마나 플러그인의 업데이트내역 확인, 포스트의 예약발행 또는 발행전 포스트의 초안(draft)의 삭제 등등을 관리하는데 있어 이 예약작업을 자동적으로 시행하고 있습니다.

오늘은 워드프레스에서 제공하는 함수(Function)와 훅(Hook)을 이용하여 예약 스케줄을 지정하고, Linux OS(포스트에서는 웹 서버가 Ubuntu 14.04 를 기준합니다) 의 Crontab 명령어를 이용하여서 지정된 시간(주기)마다 예약된 스케줄을 실행하도록 구성하겠습니다.

 

screenshot-mail.naver.com 2015-12-29 14-57-04

<Cron 작업을 이용해 1분 마다 시스템에서 자동으로 이메일 발송을 하도록 예약 후 이메일 수신 확인>

 

 

워드프레스 함수 리스트

wp_next_scheduled($hook_name); // 주어진 액션 Hook 의 다음 예약 스케줄이 실행되어야 하는 시간을 반환합니다(타임스탬프)
wp_schedule_event(time(),'interval','액션훅이름'); // 예약 스케줄을 추가합니다
_get_cron_array(); // 현재 시스템에 등록된 모든 예약 스케줄을 반환합니다

Ubuntu 14.04 Crontab 관련 명령어

$ crontab -e;

$ crontab -l;

 

 

/*
Plugin Name: LINCHPINsoft Example
Plugin URI: 
Description: 린치핀소프트 Cron 예제
Version: 1.0
Author: LINCHPINSoft
Author URI: http://www.LINCHPINsoft.com
Text Domain: LINCHPINSystem
*/


register_activation_hook(__FILE__,'active_plugin'); // 플러그인을 활성화활때 실행되어야 하는 함수를 지정합니다
function active_plugin(){
if(!wp_next_scheduled('eventLINCHPINaction')) // 이미 동명의 예약 액션 훅 이름이 있는지 확인합니다
{
wp_schedule_event(time(),'per30sec','eventLINCHPINaction'); // 예약 스케줄을 등록 합니다
// time() : 현재 등록 하고 있는 예약작업을 언제 이후부터 실행할지 정해주는 타임스탬프 입니다
// 'per30sec' 아래의 addCronFrequency() 함수에 추가하는 예약 스케줄 실행 빈도입니다.매 30초마다 실행할것을 의미합니다
// 'eventLINCHPINaction' 은 예약 스케줄로 들옥된 액션 훅의 이름입니다
}
}

add_filter('cron_schedules','addCronFrequency'); // 워드프레스에서는 매주/매시/매일 이렇게 세가지 주기가 기본적으로 제공합니다. 이 필터 훅을 이용하여 주기를 추가할수 있습니다.
add_action('eventLINCHPINaction','doJob'); // 등록된 예약 스케줄에서 수행해야 하는 콜백 함수를 지정합니다.


function addCronFrequency($schedules){
// 5분,1분,30초마다 예약 작업을 수행할수 있도록 스케줄 빈도를 추가합니다 
$schedules['per5min'] = array(
'interval' => 300, // 초 단위로 등록합니다
'display' => __('Every 5min')
);

$schedules['per1min'] = array(
'interval' => 60,
'display' => __('Every 1min')
);

$schedules['per30sec']= array(
'interval' => 30,
'display' => __('Every 10sec')
);
return $schedules;
}

function doJob(){
// 위에서 지정된 예약스케줄마다 실행되어야 하는 함수를 정의합니다. 여기서는 해당 특정 이메일주소로 이메일 발신을 수행합니다.
$tz = 'Asia/Seoul'; 
$dt = new DateTime('now', new DateTimeZone($tz)); 
$df = $dt->format('[Y-m-d H:i:s]'); 
$to = 'ceo@LINCHPINsoft.com';
$from = 'wpCronSystem@LINCHPINsoft_Asia_tokyo_aws.com'; 
$subject = '[ LINCHPINSoft | 린치핀소프트 ] Cron Schedule _______' . $df;
$message = '이 메일은 린치핀소프트 크론 예제에서 발송된 이메일입니다.____ 시각 : ' . $df;
wp_mail($to,$subject,$message); // 정해진 주기마다 이메일을 발신합니다
}

<예약 스케줄을 등록하는 플러그인 소스코드>

위의 소스코드에서 주석과 같이 참고해보시면 대략적인 흐름을 쉽게 이해 하실수 있을겁니다.우선 13번째 라인 부터 플러그인이 활성화될때  wp_schedule_event() 함수를 이용하여, “eventLINCHPINaction” 액션 훅을 등록합니다.23번째 라인, add_action() 함수를 이용하여 eventLINCHPINaction 훅의 콜백 함수로 “doJob”이라는 함수를 등록합니다.45번째 라인에서 doJob() 함수를 정의합니다.

 

여기까지 기술하여 워드프레스상에서 플러그인을 등록하고 활성화하면 예약 스케줄을 추가하게 됩니다.

 

 

이후에는 리눅스의 crontab 명령어를 이용하여 예약 스케줄 작업을 진행하도록 하겠습니다.

워드프레스의 모든 예약 작업의 진행은 http://워드프레스 주소/wp-cron.php 를 접속하여 진행할 수 있습니다.그래서 자신이 원하는 빈도(주기)를 crontab에 지정하여 위의 URL을 접속하면 자신이 원하는 주기로 예약작업을 수행 할 수 있습니다.

사실 이렇게 진행하게 되면, 위의 wp_schedule_event() 함수에서 지정한 빈도대로 스케줄이 작용하지 않습니다.

 

screenshot-52.68.215.28 2015-12-29 15-02-39

리눅스에서 “$ crontab -e”를 입력하여 실행하면, 위처럼 예약 스케줄을 추가할수 있는 에디터로 연결됩니다.(OS와 에디터별로 화면은 다르게 표시될수 있습니다. 이포스트는 Ubuntu 14.04 Vim 에디터 기준입니다)

cron의 설정방법은 https://en.wikipedia.org/wiki/Cron 을 참고하세요. 위 스크린샷에서 26번째 줄을 보면 매1분마다 http://www.linchpinsoft.com/wp-cron.php 를 접속하도록 예약 스케줄을 추가합니다.

이후에는 정상적으로 Cron Job이 실행되면 매 1분마다 워드프레스에서 추가한 예약 작업이 실행됩니다. 위의 예제에서는 워드프레스 플러그인에서 이메일을 발신하는 예약작업을 스케줄하였고, 위의 crontab을 통해 매 1분마다 예약작업을 진행하도록 구성하였습니다.

screenshot-homepage114.co.kr 2015-12-29 14-58-15

위 스크린샷은 워드프레스 크론작업이 구동되고 있는 아파치 웹 서버의 액세스 로그입니다. 보시는 것처럼 /wp-cron.php 파일을 향해 1분마다 접속 액세스가 생성되는것을 확인할 수 있습니다.

 

오늘 소개해드린 내용은 온전히 워드프레스의 기본 함수만으로 Cron작업을 구성하지 않고 워드프레스의 wp_schedule_event() 함수와 Ubuntu OS의 crontab을 모두 사용하여 구성하는 방법을 소개해 드렸습니다. 워드프레스의 예약 스케줄 작업등은 그 주기의 빈도가 높을수록 서버에 부하를 줄 영향이 클 수 있으므로 wp-config.php  파일에서 기본 크론 작업은 Disable 하고 위처럼 자체적으로 crontab을 이용하여 예약 스케줄의 빈도와 작업을 정의해볼 수 있습니다.

 

1