| layout | post | |||
|---|---|---|---|---|
| title | ์๋ํ๋ ์ค์ Cron | |||
| description | WP-Cron์ ์๋ํ๋ ์ค์์ ์๋ํ๋ cron ์์คํ ์ผ๋ก Unix/Linux ์์คํ ์ cron๊ณผ ์ ์ฌํ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค. WP-Cron์ด ๋ฌด์์ด๊ณ ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ฐ๋ ๊ณผ ์ฌ์ฉ๋ฒ์ ์๊ฐํฉ๋๋ค. | |||
| thumbnail | https://usefulpa.s3.amazonaws.com/images/2014/wp_cron_clock.jpg | |||
| category | wordpress | |||
| tags |
|
cron์ ์์คํ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ ํด์ง ์๊ฐ ๋๋ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ค ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ๋ UNIX ๋ช ๋ น์ด๋ค. ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ๋ณตํด์ ์ํํด์ผ ํ๋ ์์ ๋ค์ ๋ฏธ๋ฆฌ ์ค์ผ์ค๋ง(scheduling)ํด ๋๋ฉด ์ง์ ๋ ์๊ฐ์ ํด๋น ์์ ์ด ์๋์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์, ๋ฐฑ์ ์ด๋ ์์คํ ์ ๋ฐ์ดํธ ๊ฐ์ ๋ฐ๋ณต ์์ ์ด๋ ์ด๋ฉ์ผ ๋ฐ์ก ๋ฑ ์๊ฐ์ด ์ ๋ฒ ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ฐฐ์น(batch) ์์ ๋ฑ์ ํญ๋๊ฒ ์ฌ์ฉ๋๋ ์๊ธดํ ๋ช ๋ น์ด๋ค.
์๋ํ๋ ์ค(WordPress)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ์๋ ์ด๋ฐ cron๊ณผ ์ ์ฌํ ์์ ๋ค์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๊ฒ ๋ชจ๋ฅด๊ฒ ์๊ธด๋ค. ์๋ฅผ ๋ค์ด ํฌ์คํ ์๊ฐ์ ์์ฝํด ๋ ๊ธ์ ๋ฐฐํฌ(publish)ํ๊ฑฐ๋ ์ ๊ธ์ด ์ฌ๋ผ์ค๋ฉด ๋ด์ค๋ ํฐ๋ฅผ ๋ฐ์กํ๊ฑฐ๋ ํ ๋ง๋ ํ๋ฌ๊ทธ์ธ์ ์๋ก์ด ์ ๋ฐ์ดํธ๊ฐ ์๋์ง ๊ฒ์ฌํ๋ ๊ฒ๊ณผ ๊ฐ์. ์ด๋ฐ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ๋ชฉ์ ์ผ๋ก ์๋ํ๋ ์ค๋ UNIX์ cron๊ณผ ์ ์ฌํ ๊ฐ๋ ์ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๊ณ ์๋๋ฐ, UNIX์ cron๊ณผ ๋น๊ตํ๋ ์๋ฏธ๋ก ํํ 'WP-Cron'์ด๋ผ ๋ถ๋ฆฐ๋ค.
ํต์์ ์ธ cron์ด ์ค์ผ์ค์ ๋ง์ถฐ ์ง์ ๋ ์๊ฐ์ ์ ํํ๊ฒ ์ํ๋๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ WP-Cron์ PHP๊ธฐ๋ฐ์ ์น๊ธฐ๋ฐ ์์คํ ์ธ ์๋ํ๋ ์ค์ ํน์ฑ ์, ์น์์ฒญ์ด ๋ค์ด ์ฌ ๊ฒฝ์ฐ์๋ง ์คํ๋๋ค. ์ฆ ์ฌ์ฉ์๊ฐ ์๋ํ๋ ์ค ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ์ ๋งค๋ฒ cron์ด ์คํ๋๋๋ฐ, ์ด ๋ ์๋ํ๋ ์ค๋ ์์ฒด cron ์ค์ผ์ค ์์คํ ์์ ํ์ฌ ์ํํด์ผ ํ cron ์์ ์ด ์๋์ง ๊ฒ์ฌํ๊ณ ์์ผ๋ฉด ํด๋น ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ์ํค๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๋ง์ฝ (๊ด๋ฆฌ์๋ฅผ ํฌํจ) ์๋ฌด๋ฐ ๋ฐฉ๋ฌธ๋ ์๋ ์ฌ์ดํธ๋ผ๋ฉด WP-Cron์ '๊ฒฐ์ฝ' ์คํ๋์ง ์๋๋ค (์ด๋ ๊ฒ ์คํ๋์ง ์๋ cron ์์ ๋ค์ ๊ณ์ ๋ชจ์๋ค๊ฐ ์ธ์ ๊ฐ ํ ์ฌ๋์ ๋ฐฉ๋ฌธ์๊ฐ ๋ฐฉ๋ฌธํ์ ๋ ๊ทธ๋์ ๋ฏธ๋ค ๋๋ cron ์์ ๋ค์ด ๋ชจ์กฐ๋ฆฌ ํ๋ฒ์ ์คํ๋์ด ์ ์์๋๊ฐ ๋๋ ค ๋ณด์ด๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๊ธฐ๋ ํ๋ค).
์๋ํ๋ ์ค ๋ด๋ถ์ ์ผ๋ก cron์ ๋ค์ 2๊ฐ์ ํ์ผ์ด ๋ด๋นํ๋ค:
- /wp-includes/cron.php : ๋ชจ๋ cron ์ฒ๋ฆฌ ๊ด๋ จ API ํจ์๋ค์ด ๋ค์ด ์์
- /wp-cron.php : cron ํธ์ถ์ ์ฌ์ฉ๋๋ ์คํฌ๋ฆฝํธ ํ์ผ
WP-Cron์ ๋ด๋ถ ์๋ ๋ฉ์ปค๋์ฆ์ ์ ์์ค์ฝ๋๋ฅผ ์ฐธ์กฐํ๊ธฐ๋ก ํ๊ณ , ์ฌ๊ธฐ์๋ ์ด๋ค WP-Cron ๊ด๋ จ API์ ๊ฐ๋จํ ์ฌ์ฉ๋ฒ๋ง ์๊ฐํ๊ธฐ๋ก ํ๋ค.
WP-Cron์ ํฌ๊ฒ **cron ์ด๋ฒคํธ(event)**๋ผ๊ณ ๋ถ๋ฅด๋ cron ์์ ๋ถ๋ถ๊ณผ ์ด๋ค ์์ ์ ์คํํ๋ ์ฃผ๊ธฐ์ธ ์ค์ผ์ค(schedule) ๋ถ๋ถ์ผ๋ก ๋๋ ๋ณผ ์ ์๋๋ฐ, cron ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ API ํจ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
- wp_schedule_event() : cron ์ด๋ฒคํธ ์ถ๊ฐ
- wp_schedule_single_event() : 1ํ ์คํ cron ์ด๋ฒคํธ ์ถ๊ฐ
- wp_next_scheduled() : cron ์ด๋ฒคํธ์ ๋ค์ ๋ฒ ์ํ์๊ฐ
- wp_unschedule_event() : cron ์ด๋ฒคํธ ์ ๊ฑฐ
์๋ฅผ ๋ค์ด, 1์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ํํด์ผ ํ ์ด๋ค ์์ ์ cron ์ด๋ฒคํธ๋ก ์ถ๊ฐํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ทธ ์์ ์ ์ก์ ํ (hook)์ผ๋ก ์ฒ๋ฆฌํ ๋ค์ wp_schedule_event()๋ก ์ถ๊ฐํ๋ฉด ๋๋ค.
// ์ cron ์ด๋ฒคํธ ์์ฑ
add_action( 'prefix_hourly_event_hook', 'prefix_do_this_hourly' );
function prefix_do_this_hourly() {
// 1์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ํ๋ ์ด๋ค ์์
}
// ์์ cron ์ด๋ฒคํธ๋ฅผ ์ค์ผ์ค์ ์ถ๊ฐ
wp_schedule_event( time(), 'hourly', 'prefix_hourly_event_hook' );
์ด ๋ wp_schedule_event()์ ๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋ 'hourly'๋ cron์ ์คํ๊ฐ๊ฒฉ์ ์๋ฏธํ๋๋ฐ, ์๋ํ๋ ์ค์๋ ๊ธฐ๋ณธ์ผ๋ก hourly, twicedaily, ๋ฐ daily์ 3๊ฐ์ง ๊ฐ๊ฒฉ(intervals)์ด ๋ฑ๋ก๋์ด ์์ผ๋ฉฐ, cron_schedules ํํฐ ํ ์ ํตํด ์ผ๋ง๋ ์ง ํ์ฅ ๊ฐ๋ฅํ๋ค. ๋ค์์ cron ์ค์ผ์ค์ ์๋ก weekly๋ผ๋ ์ค์ผ์ค์ ์ถ๊ฐํ๋ ์ฝ๋๋ค.
function my_add_weekly( $schedules ) {
// ์๋ก 'weekly' ์ค์ผ์ค์ ์ถ๊ฐ
$schedules['weekly'] = array(
'interval' => 604800,
'display' => __('Once Weekly')
);
return $schedules;
}
add_filter( 'cron_schedules', 'my_add_weekly' );
์ฐธ๊ณ ๋ก, ์๋ํ๋ ์ค ์ฌ์ดํธ ๋ด์์ ์ค์ ๋ก ์ด๋ค cron ์์ ๋ค์ด ๋ฑ๋ก๋์ด ์ด๋ป๊ฒ ์คํ๋๊ณ ์๋์ง๋ฅผ ํ์ธํด ๋ณด๋ ค๋ฉด WP Crontrol ๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌํ๋ค. ์ด ํ๋ฌ๊ทธ์ธ์ ์คํ ์ค์ธ cron ์์ ์ ํ์ธํ ๋ฟ ์๋๋ผ ๋ณ๊ฒฝ/์ญ์ ํ ์ ์๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค.
์์๋ ๋งํ์ง๋ง WP-Cron์ ์ด๋ฆ์ ๊ฐ์ 'cron'์ด๊ธด ํ์ง๋ง 'ํ ์ข cron(UNIX cron)'๊ณผ๋ ๋ค๋ฅธ ์ฑ๊ฒฉ์ cron์ด๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ ๋๋ก ์๋ํ์ง ์์ ์ ์๋ค.
- ๋ฐฉ๋ฌธ์๊ฐ ๊ฑฐ์ ์๋ ์ฌ์ดํธ(์์ ์ค๋ช )
- ์บ์(cache) ์์คํ ์ด ์ ์ฉ๋ ์ฌ์ดํธ
- ์ธ์ฆ, IP ํํฐ๋ง, ์ฟ ํค ํํฐ๋ง ๋ฑ์ผ๋ก wp-cron.php ํธ์ถ ์์ฒด๊ฐ ์ฐจ๋จ๋ ์ฌ์ดํธ
๋ํ ๋ฐฉ๋ฌธ์๊ฐ ์์ฃผ ๋ง์ ํธ๋ํฝ์ด ๋์ ์ฌ์ดํธ์ธ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก WP-Cron์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. ๋ฐฉ๋ฌธ์๊ฐ ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ๋งค๋ฒ ์คํ๋๋ cron์ ์ฑ๊ฒฉ ์, ๋์์ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ์ ์ํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๋์์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ฉฐ, ์ด๋ ์ฌ์ดํธ์ ๋ฆฌ์์ค๋ฅผ ์ฐจ์งํ๊ณ ์ฑ๋ฅ์๋ ์ํฅ์ ๋ฏธ์น ์ ์๋ค. ๋ฌผ๋ก ์๋ํ๋ ์ค๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก cron ์ฒ๋ฆฌ์ ๋ฝ(lock) ์์คํ ์ ์ ์ฉํด ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์ง๋์น ์ฐ๋ ค๋ ํ์ง ์์๋ ๋๊ฒ ์ง๋ง.
๊ทธ๋ ๋ค๋ฉด ์์ WP-Cron์ ์ฃฝ์ด๋ ๊ฑด ์ด๋จ๊น? ์ข์ ๋ฐฉ๋ฒ์ ์๋๋ค. ์๋๋ฉด cron์ ์๋ํ๋ ์ค ์ ์ฌ๋ฌ ๊ตฐ๋ฐ์์ ์ฌ์ฉ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด ๊ธฐ๋ฅ์ ์์ ํ ๋๊ฒ ๋๋ฉด cron์ด ํ์ํ ๊ธฐ๋ฅ๋ค์ ๋์ํ์ง ์๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์ ์ฐ๋ฆฌ๋ WP-Cron์์ ๋ฒ์ด๋ ์ง์ง cron์ผ๋ก ๊ฐ์ํ ์ ์๋ค. ์ฐ์ WP-Cron์ ๋์. /wp-config.php ํ์ผ์ ๋ค์ ์์๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค.
// ๋ด๋ถ WP-Cron ๋นํ์ฑํ
define('DISABLE_WP_CRON', true);
๊ทธ๋ฐ ๋ค์, ์ง์ง cron์ ๊นจ์ฐ์. ๋ง์ฝ 5๋ถ ๋จ์๋ก ํธ์ถํ๋ ค๋ฉด, crontab์ ๋ค์๊ณผ ๊ฐ์ด wp-cron.php๋ฅผ ํธ์ถํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค. (crontab์ ์ฌ์ฉ๋ฒ์ ์๋ตํ๋ค)
*/5 * * * * wget -q -O - http://www.your-site.com/wp-cron.php
์ด ๋ wget ๋ช ๋ น์์ ์ฌ์ฉํ -O ์ต์ ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ์ด ์๋ ํ์ค์ถ๋ ฅ(STDOUT)์ผ๋ก ๋ณด๋ด๋ ์ต์ ์ด๋ฉฐ, wget ๋์ ์๋ฅผ ๋ค๋ฉด curl ๊ฐ์, HTTP ์น์์ฒญ์ ์ํํ๋ ๋ช ๋ น์ด๋ฉด ์ด๋ค ๊ฒ์ ์ฌ์ฉํ๋ ๋ฌด๋ฐฉํ๋ค.

