드루팔의 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_set_limit_timeout( 0 ) ) { // 0는 무한대를 의미, 600 의 경우 10분을 의미.
이렇게 했음에도 불구하고, 아래와 같은 에러가 계속 난다면,
Fatal error: Maximum execution time problem of 240 seconds exceeded
[2] 세째 시도 : .htaccess를 이용한 처리 시간의 제한 늘리기
드루팔 폴더의 .htaccess 에 아래와 같은 구문으로 시간을 늘려보자.
그래도 안된다면, (최후의 방법이다)
[3] 네째 시도 : PHP 환경설정의 수정으로 처리 시간의 제한 늘리기
PHP 전반의 환경설정에 있는 execute timeout 관련한 항목을 수정/재기동 하자.
이렇게 하면 실행 시간이 무한대로 확장된다.
아마도 이건 최후의 방법이라 왠만하면 다 해소될 것이다.
하지만 시스템 전체에 영향을 줄 수 있으므로 어지간해서는 이를 수정할
권한이 주어지지 않을 지도 모른다. 또한,
무한대 설정이 오히려 안전하지 않을 수도 있으니 조심해서 사용하자.
- Login to post comments
댓글
만일 PHP 소스 코드
만일 PHP 소스 코드 자체를 수정한다면 이런 방법도 있다.
set_time_limit(0);