드루팔의 CRON이 실행 타임아웃 Execute Timeout 에 완료되지 못할 경우

드루팔의 CRON이 실행 타임아웃 Execute Timeout 에 완료되지 못할 경우

poormanscron 모듈은 콘솔 베이스의 cron 설정이
여위치 않는 개발자들에게는 분명 유용한 도구이다.

아쉽게도 이 모듈과 관련해서 많은 문제들이 생기는데...
(맨 아래의 "관련이 있나요?"를 살펴보면 여러 글이 나온다)
이번 경우는 이 모듈이 사고를 친 게 아니라 시스템의 환경 탓에
실행 타임아웃이 걸리는 경우의 처리 방법을 기록해 둔다.

[1] 첫째 시도 : 처리 부하를 줄이기

관리 > 사이트 환경 설정 > 검색 설정에 가서
Number of items to index per cron run:
항목의 검색 인덱싱용 처리 아이템 갯수를 10으로 줄여보자.
그런 후에 다시 cron을 수동 실행해 보자. 문제가 없다면 OK.

그럼에도 불구하고, 아래와 같은 에러가 계속 난다면,
Fatal error: Maximum execution time problem of 240 seconds exceeded

[2] 둘째 시도 : 소스 수정에 의한 처리 시간의 제한 늘리기

이 방법을 poormanscron 모듈을 직접 수정하므로 권하지 않는다.

그래도 하겠다면, 수정할 파일은 poormanscron.module 파일이다.
어떤 모듈의 파일을 직접 수정하는 경우, 나중에 원래 개발자의
버전업에 따라 소스가 충돌이 날 수 있으므로 가능한 수정판은,
all/modules 가 아닌 defaults/modules 폴더에 두기를 바란다.

아래와 같이 시간 제한을 변경할 수 있는 함수를 추가한다.

/**
* Implmentation of drupal_cron_run().
*/
function drupal_cron_run_set_limit_timeout( $sec=240 ) {
  // If not in 'safe mode', increase the maximum execution time:
  if (!ini_get('safe_mode')) {
    set_time_limit( $sec );
  }

  // Fetch the cron semaphore
  $semaphore = variable_get('cron_semaphore', FALSE);

  if ($semaphore) {
    if (time() - $semaphore > 3600) {
      // Either cron has been running for more than an hour or the semaphore
      // was not reset due to a database error.
      watchdog('cron', 'Cron has been running for more than an hour and is most likely stuck.', array(), WATCHDOG_ERROR);

      // Release cron semaphore
      variable_del('cron_semaphore');
    }
    else {
      // Cron is still running normally.
      watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
    }
  }
  else {
    // Register shutdown callback
    register_shutdown_function('drupal_cron_cleanup');

    // Lock cron semaphore
    variable_set('cron_semaphore', time());

    // Iterate through the modules calling their cron handlers (if any):
    module_invoke_all('cron');

    // Record cron time
    variable_set('cron_last', time());
    watchdog('cron', 'Cron run completed.', array(), WATCHDOG_NOTICE);

    // Release cron semaphore
    variable_del('cron_semaphore');

    // Return TRUE so other functions can check if it did run successfully
    return TRUE;
  }
}

그런 다음, 약 50라인 근처에 있는 아래 구문을 수정한다.

기존 :    if (drupal_cron_run()) {

수정 :    if ( drupal_cron_run_set_limit_timeout( 0 ) ) {   // 0는 무한대를 의미,  600 의 경우 10분을 의미.

이렇게 했음에도 불구하고, 아래와 같은 에러가 계속 난다면,
Fatal error: Maximum execution time problem of 240 seconds exceeded

[2] 세째 시도 : .htaccess를 이용한 처리 시간의 제한 늘리기

드루팔 폴더의 .htaccess 에 아래와 같은 구문으로 시간을 늘려보자.

php_value max_execution_time 0

그래도 안된다면, (최후의 방법이다)

[3] 네째 시도 : PHP 환경설정의 수정으로 처리 시간의 제한 늘리기

PHP 전반의 환경설정에 있는 execute timeout 관련한 항목을 수정/재기동 하자.

max_execution_time = 0

이렇게 하면 실행 시간이 무한대로 확장된다.

아마도 이건 최후의 방법이라 왠만하면 다 해소될 것이다.
하지만 시스템 전체에 영향을 줄 수 있으므로 어지간해서는 이를 수정할
권한이 주어지지 않을 지도 모른다. 또한,
무한대 설정이 오히려 안전하지 않을 수도 있으니 조심해서 사용하자.

댓글

만일 PHP 소스 코드

만일 PHP 소스 코드 자체를 수정한다면 이런 방법도 있다.
set_time_limit(0);