2012-03-01 1 views
5

29 분 동안 실행 후 PHP cron 작업이 실패했습니다. 로그의 오류 (/var/log/php_errors.log)입니다 :최대 실행 시간 치명적인 오류로 인해 PHP cron 작업이 조기 종료 됨

[01-Mar-2012 00:32:57 UTC] PHP Fatal error: Maximum execution time of 60 seconds exceeded in /path/file.php on line 2079 

크론를 트리거하는 crontab을 항목은 다음과 같습니다

00 00 * * * /usr/bin/php /path/file.php 

내 연구 나는이가 max_execution_time 구성 설정 때문에 관련이 생각하지 않는다에서 :

  1. 실제로 나는 그것이 29:18 분 (즉, 오류 메시지와 비슷한 60 분 이상) 동안 실행되었다는 것을 알고 있습니다. 왜 스크립트가 조기 종료됩니다 : - the PHP docs에서
  2. 명령 줄에서 PHP를 실행하는 경우 기본 설정은 0

Q는?


주 :

스크립트는 매우 무거운이며, DB 쿼리의 수천을 실행 않습니다,하지만 난 top을 실행하고 CPU 부하가 높지 않았다.

오류 로그에서 라인이 mysql_query 호출입니다 :

$sql = "SELECT SUM(amount) FROM mytab WHERE mem = '$id' AND validto > '$now'"; 
$res = mysql_query($sql); 

> php -v 
PHP 5.3.10 (cli) (built: Feb 2 2012 17:34:38) 
Copyright (c) 1997-2012 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies 
    with Suhosin v0.9.33, Copyright (c) 2007-2012, by SektionEins GmbH 

> cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 5.7 (Tikanga) 

업데이트 - 스크립트가 실시간으로 29 분 동안 실행할 수있는 이유가 발견하지만, PHP는 인용 실행 시간을 훨씬 더 낮출 수 있습니다.

때마다 시스템이 스크립트가 실행되어있는 최대 시간을 결정할 때 포함되지 않는 등 시스템(), 스트림 작업, 데이터베이스 쿼리를 사용하여 호출과 같은 스크립트의 실행 외부에서 발생하는 활동에 소요 .

(the set_time_limit() docs 에서뿐만 아니라 the max-execution-time docs에서 언급 됨). 대부분의 스크립트는 실행 시간을 클록 업하지 않은 db 쿼리와 지불 API 호출을 오랫동안 실행했기 때문에 이것은 저에게 의미가있었습니다.

+1

cron 작업은 오류와 관련이 없습니다. 이것은 PHP의 순수한 문제입니다. 메모리 누수를 검사하고, 루프를 실행 한 후 일부 버그 배열의 설정을 해제하십시오. 쿼리 사이에 다른 큰 변수를 설정하십시오. –

+0

또한 설명서에 다음과 같이 표시되어 있습니다. _ 최대 실행 시간은 시스템 호출, 스트림 작업 등의 영향을받지 않습니다. 사실 cron에 의해 실행 된 PHP _CLI_인지 확인할 수 있습니까? –

+0

선택 속도를 높이기 위해 적합한 색인이 있는지도 확인합니다. *** mem *** 및 *** validto ***에 대한 색인이 있습니까? –

답변

1

확실 에 대한 다음 PHP Fatal error: Maximum execution time of 60 seconds exceeded를 얻을 경우 PHP 코드를 실행의 일부 조각이 어딘가에 문 set_time_limit(60)을 실행합니다. PHP CLI 모드는 기본적으로 시간 제한이 없습니다. 코드 경로가 시간 제한을 설정하면이를 준수합니다. PHP가 거의 30 분 동안 실행 된 이유는 set_time_limit이 CPU 시간 제한을 설정하고 프로세스가 I/O가 제한되거나 다른 프로세스를 기다리는 경우 전체 CPU 사용량이 실시간 클록에서 훨씬 나중에 60 초 표시가되기 때문입니다 .

set_time_limit에 대한 전체 소스 코드를 검색해보십시오. 아무 것도 찾지 못한 경우 set_time_limit(0)을 스크립트 시작 부분에 추가하여 60 초 제한이 로컬로 수정 된 구성 파일에서 오지 않았는지 확인하십시오. 예를 들어 Ubuntu LTS에서 PHP CLI 구성은 /etc/php5/cli/php.ini으로 정의됩니다.

+0

감사합니다. set_time_limit에 대한 유용한 정보 grepping이 문제를 드러냈다. – Tom

2

글쎄, 당신은 시간 제한에 대한 더 큰 값을 설정하거나 set-time-limit()를 사용하여 제한을 설정할 수 있습니다

<?php set_time_limit(0); ?> 

을하지만 acctually 나도 스크립트의 시작이 사용

ignore_user_abort(1); 
1

불행히도 나는 코멘트를 쓸 수 없다. 그래서 내 질문은 여기에있다. 수동으로 이것을 실행하면 어떻게 될까? 그것도 시간 초과됩니까?

수동으로 실행할 때 시간이 초과되지 않으면 실제로 쉘을 실행하고 "/ usr/bin/php /path/file.php"파일을 실행하는 작은 쉘 스크립트를 호출하는 것이 좋습니다. 껍질.

00 00 * * * /usr/local/scripts/start_php_job.sh

File: /usr/local/scripts/start_php_job.sh 
#!/usr/bin/bash 
date 

/usr/local/bin/php /path/to/script 

date 
+0

감사합니다. 명령 줄에서 수동으로 실행 해 보았고 cron을 통해 자동으로 실행될 때와 같은 오류가 발생했습니다. – Tom

+1

실행 중에 메모리 소비를 기록 할 수 있습니까? "리소스 제한 (ulimit -a)은 무엇입니까? 그냥 이런 식으로 중지하면 버퍼 캐시가 사용자 최대 mem 사용량, SQL Server 최대 메모리 사용량 또는 시스템 RAM이 최대 값에 도달하는 것으로 가정합니다. 나는 ps -uef (나는 이것도 메모리를 보여주는 것으로 생각한다)와 grep 프로세스를 제안한다. 매 5 초마다 수행한다. * return * 코드가 실제로 무엇인지 또한 멋질 것이다. 만약 당신이 그것을 실행한다면 위에 설명 된 쉘 스크립트에서 echo $?를 통해 Code Code를 얻을 수 있으며, 아마도 더 많은 힌트를 줄 것이다. –

관련 문제