워드프레스에서 wp-cron.php 비활성화하여 사이트 속도 향상시키기

WordPress에서는 wp-cron.php라는 파일을 사용하여 가상 Cron 작업이나 예정된 글 게시, 플러그인/테마 업데이트 확인, 알림 이메일 송부 등과 같은 작업을 자동으로 수행합니다.

기본적으로 워드프레스는 예정된 작업이 있을 때 누군가가 워드프레스 사이트를 방문할 때마다 wp-cron.php를 호출하도록 설정되어 있습니다.

트래픽이 적은 사이트의 경우에는 아무 문제가 없지만 방문자들이 방문할 때 여러 번 예정된 작업을 확인하는 것은 매우 비효율적일 수 있고 서버에 리소스 사용량 문제를 야기하고 사이트 로딩이 느리게 할 수 있습니다.

wp-cron.php 비활성화하기

얼마 전에 워드프레스 사이트가 매우 느려지는 일이 있었습니다. 웹호스팅 담당자에게 확인해보니 wp-cron.php이 너무 많이 호출되어 있어서 사이트 리소스가 부족해져서 나타나는 현상이라는 말을 들었습니다. (사실 알고 보니 이것은 표면적인 문제였고 근본적인 원인은 다른 곳에 있었습니다.) 그래서 wp-cron.php를 비활성화한 적이 있었습니다. wp-cron.php를 비할성화하려면 다음과 같이 wp-config.php 파일에 define('DISABLE_WP_CRON', 'true');만 추가해주면 됩니다.

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

define('DISABLE_WP_CRON', 'true');

수정한 후에 저장하도록 합니다. 그러면 새로운 방문자가 사이트를 방문하더라도 wp-cron.php 파일이 자동으로 실행되지 않습니다.

수동으로 wp-cron.php의 Cron 작업 설정하기

wp-cron.php를 비활성화하면 워드프레스에서 수행해야 하는 자동 작업이 실행되지 않습니다. 이 경우 수동으로 실행되도록 설정할 수 있습니다. 다음 방법은 Bluehost와 같이 cpanel을 제공하는 경우에 이용할 수 있습니다.

  1. cpanel에 로그인합니다.
  2. advanced > Cron Jobs를 클릭합니다.
  3. Common Settings 드롭다운에서 Once Per Hour를 선택합니다.
    manual cron jobs 1
  4. Hour 드롭다운에서 Every Sixth Hour를 선택합니다.
    manual cron jobs 2
  5. 이제 마지막으로 아래의 빈 칸에 다음과 같이 입력합니다.
    cd /home/username/public_html; php -q wp-cron.php
  6. username은 cpanel 사용자 이름입니다. "Add New Cron Job"을 누르면 새로운 Cron 작업이 추가됩니다.
    manual cron jobs 3
  7. 이제 새로운 Cron 작업이 추가되어 있는 것을 볼 수 있습니다. 위와 같이 설정하면 6시간마다 wp-cron.php 스크립트를 실행하게 됩니다.

Cron 작업이 실행될 때마다 Cron Email 섹션에 입력한 이메일 주소로 통지가 전송됩니다. 또는, Command 라인에 다음과 같은 코드를 사용할 수도 있습니다.

wget http://www.yoursite.com/wp-cron.php?doing_wp_cron=1 > /dev/null 2>&1

또는 일부 시스템에서는 curl 함수가 사용될 수도 있습니다.

curl -s http://www.yoursite.com/wp-cron.php?doing_wp_cron=1 > /dev/null

자세한 내용은 이 글을 참고해보시기 바랍니다. wp_schedule_even를 사용하여 수동으로 Cron 작업을 예약하는 방법은 "Properly Setting Up WordPress Cron Jobs" 글을 참고해보세요. (> /dev/null 2>&1를 추가하면 스크립트를 조용히(silent) 실행하고 어떠한 출력도 생성하지 않습니다. 이 글에 이 내용에 대해 자세히 설명되어 있네요.)

예약글 발행과 같은 워드프레스의 일부 기능은 WordPress Cron을 이용합니다. WP-CRON을 비활성화할 경우 일부 기능이 제대로 작동하지 않을 수 있습니다.

WP_CRON_LOCK_TIMEOUT

다른 방법으로 WP_CRON_LOCK_TIMEOUT을 사용하여 Cron 작업이 실행될 시간을 조정할 수 있습니다. 워드프레스가 로드되면 Cron 작업이 실행 중(lock 상태)인지 확인합니다. Cron이 실행되지 않으면 Lock을 만들려고 시도하고, Lock Timeout에 도달하지 않은 경우 Cron이 실행되지 않습니다.

실행 중인 Cron 작업이 없고 Timeout이 경과한 경우 Cron이 실행됩니다(참고). 다음과 같은 코드를 wp-config.php에 추가하도록 합니다.

define('WP_CRON_LOCK_TIMEOUT', 3600);

위에서 숫자는 초(sec)를 나타내며 3600은 60분을 의미합니다.

참고:

일부 글에 제휴 링크가 포함될 수 있으며 파트너스 활동으로 일정액의 수수료를 받을 수 있습니다.

10개 댓글

  1. define('DISABLE_WP_CRON', 'true');
    define('WP_CRON_LOCK_TIMEOUT', 3600);

    wp-config.php에 2 줄을 추가 했더니 쿼리 모니터에,
    Constant WP_CRON_LOCK_TIMEOUT already defined

    에러가 뜹니다.
    이미 정의되었다고 나오는데 ,.. 어케 해결이 될까요?

    1. 안녕하세요, jason님. 오류 메시지에서 의미하는 바와 같이 비슷한 코드가 이미 wp-config.php 파일에 추가되어 있을 때 이와 같은 에러가 표시될 수 있습니다. wp-config.php 파일에서 wp-config.php 파일에 WP_CRON_LOCK_TIMEOUT 라인이 이미 추가되어 있는지 체크해보시기 바랍니다. 해당 라인을 찾아서 삭제하고, 위의 두 라인을 /* That's all, stop editing! Happy publishing. */ 라인 바로 위에 이동시켜보시기 바랍니다.

  2. 안녕하세요.
    블로그 내용을 보던중, SEO 플러그인으로 RankMath를 사용하신다는 내용을 보았습니다. 이 경우, 본 내용에서 언급하신 define('WP_CRON_LOCK_TIMEOUT', 3600); 상수를 정의하더라도

    RankMath에서 부여한 Cron 스케줄은 여전히 작동하는 문제가 있지 않으시던가요?
    action_scheduler_run_queue 가 매분마다 실행되게 되어있는 부분입니다.

    RankMath로 인해 실행되는 스케줄은
    action_scheduler 이외에 5분간격으로 설정되어있는wp_convert_yoast_blocks_cron_interval, wp_convert_schema_posts_cron_interval 도 확인됩니다.

    WP_CRON_LOCK_TIMEOUT 정의에도 불구하고 작동이 되고 있는데요.
    Word님도 혹시 동일한 증상을 겪고 있으시진 않으신지요?

    이 부분을 어떻게 대처하셨는지 궁금하여 문의 남깁니다.

    1. 해당 부분에 대하여 문의를 하여 Rank math에서 다음과 같은 답변을 받았습니다.

      That cron job you are seeing is the default WP Cron that runs every minute on all WordPress installations. Our plugin hooks into that to fetch the Analytics data from your Google account, but we don’t run our tasks every minute.

      You can learn more about that here: https://wplift.com/what-is-wp-cron-plus-how-to-disable-wp-cron-in-2020

      action_scheduler_run_queue는 모든 워드프레스 설치 사이트에서 1분마다 실행되는 기본 WP Cron이라고 하네요.

      아마 WP_CRON_LOCK_TIMEOUT 상수가 3600초로 설정되었기 때문에 action_scheduler_run_queue를 사용하는 이벤트가 1분마다 실행되지는 않을 것 같습니다.

      https://www.screencast.com/t/Jou2KFdCw

댓글 남기기

* 이메일 주소는 공개되지 않습니다.