드루팔의 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

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

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

Your rating: None 평균 : 5 (1 vote)

댓글

만일 PHP 소스 코드

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