2014-10-01 4 views
1

리눅스 아파치 서버 (우분투 14.04 lts, ​​아파치 2.4.7, mpm_prefork 및 mod_php)에 오랜 시간이 걸리는 PHP 스크립트가 있습니다. 이들은 아파치에 의해 살해 당한다.아파치가 오랜 시간 동안 프로세스를 실행하지 못합니다.

우리는 (하고 set_time_limit max_execution_time이라는, ...) 조정의 PHP 설정 우리는 로그에서 추적 (시스템 로그, 아파치 액세스/오류 로그)

우리는 strace를 함께 아파치 프로세스를 추적하지 않은

있습니다 :

2172 is the script process 
1939 is the apache main process 
.... 

2172 14:53:01 +++ killed by SIGKILL +++ 
1939 14:53:01 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=2172, si_status=SIGKILL, si_utime=3067, si_stime=38} --- 
+0

장기 실행 PHP 스크립트는 백그라운드 (웹 서버가 아닌)에서 실행되어야하며 데이터베이스에 '상태'에 대한 '단서'를 남겨 두어야합니다. '진행됩니다. 이것은 웹 브라우저에서 '사용자에게 친숙한'방식으로보고 될 수 있습니다. –

답변

1

ini_set('max_execution_time', -1); 을 설정하거나 루트로이 스크립트를 실행하려고, 다음 아파치는 그에게

+0

max_execution_time -1을 시도했지만 동일한 결과가 나타납니다. 그리고 bash에서 루트로 스크립트를 실행하십시오 ... 스크립트가 죽지 않았습니다. – Inexine

+0

얼마나 오래이 코드를 실행 하시겠습니까? – Daredzik

+0

20-30 분 처리에 따라 달라집니다. Apache가 스크립트를 임의로 삭제합니다. 2 분, 10 분, 15 분 ... 거의 스크립트가 죽지 않습니다. – Inexine

0

또 다른 가능성 난 죽이지 않을 것이다 아파치 2는 일정 시간 동안 아무것도 돌려 보내지 않았기 때문에 프로세스를 죽이고있다. 이는 종종 공유 호스팅에서 발생합니다. 출력 버퍼링을 사용하는 경우이를 끕니다. 그런 다음 모든 것이 자주 인쇄되어 즉시 flush()을 사용하여 정보를 Apache로 다시 보냅니다.

예 : 가장 긴 루프에서 다음을 할 수 있습니다 :

$time = time(); 
while($looping) { 
    ... Code here ... 
    if(time() > $time) { 
    echo '.'; 
    flush(); 
    //ob_flush();//If you're using output buffering (often on by default) 
    $time = time(); 
    } 
} 
+0

우리가 동안이와 시도 : 에코 "
"; echo memory_get_usage(); flush(); ob_flush(); $ cpt = 0; – Inexine

+0

그게 효과가있다. 또한'set_time_limit (30)'을 사용해보십시오. 그러면 스크립트가 실행되는 시간이 30 초로 늘어납니다. – Nathan

+0

동일한 결과를 시도합니다. – Inexine