2010-05-14 3 views
7

FastCGI 서버는 예를 들어 PHP에서 set_time_limit()을 사용하여 변경할 수없는 PHP 스크립트의 실행 시간 제한을 적용합니다. IIS도 이것을 믿습니다.PHP : 서버가 실행 시간 제한을 적용 할 때 장시간 실행되는 스크립트 코딩

mod_php에서는 잘 작동하지만 스크립트가 특정 시간 (초) 후에 종료되므로 FastCGI (mod_fcgid)에서 실패하는 PHP 응용 프로그램에 대한 가져 오기 스크립트를 작성했습니다. 나는이 시간에 당신의 시간 제한이 무엇인지를 알아내는 방법을 아직 모르고 있으며, 나는 그걸 어떻게 극복 할 것인지 결정하지 못했습니다. 리디렉션을 사용하여 작은 덩어리로 작업하는 것은 하나의 진흙탕처럼 보일 수 있지만 어떻게 될까요?

가져 오기 또는 내보내기 작업과 같이 특정 시간 (초) 후에 개별 PHP 스크립트가 서버에 의해 종료 될 수있는 장기 실행 작업을 코딩 할 때 어떤 기술을 사용합니까?

PHP가 결국 mod_php, FastCGI 또는 IIS에서 실행되는지 여부 또는 서버 수준에서 최대 실행 시간이 적용되는지 여부를 반드시 알 필요가 없도록 이식 가능한 스크립트를 작성한다고 가정하십시오. 또한 쉘 스크립트 등도 배제 할 수 있습니다.

답변

4

웹 서버에서 스크립트 시간 제한을 적용하지 않는 PHP command line interface을 사용하십시오. 스크립트 실행을 자동화해야하는 경우 cron을 사용하여 스크립트를 예약 할 수 있습니다.

+4

+1은 cron을 사용합니다. 웹 스크립트를 사용하여 장시간 실행되는 작업을 실행해서는 안됩니다. –

+0

php.ini에 선언 된 시간 제한을 다시 푸시 할 수있는 방법을 이해하지 못했습니까? thanks – Benoit

+0

@Benoit 서버 (Apache, IIS 등) 또는 서버 모듈 (FastCGI/fcgid)에 의해 부과 된 시간 제한을 언급했습니다.커맨드 라인에서 실행할 때, 당신은 그 특별한 한계를 갖지 않을 것이고, 유일한 제한은 PHP 자체가 제어 할 수있는 것일 것입니다. 커맨드 라인에서 실행하는 것의 단점은 이식성이 좋지 않다는 것입니다. Windows 서버에서 다르게 설정하거나 PHP 실행 파일의 경로에 따라 변경해야합니다. 그러나 여전히 하나의 옵션입니다. – thomasrutter

-1

당신이 정말로 말하고있는 것은 직업 대기입니다. 프론트 엔드 요청에서 PHP 코드를 비동기 적으로 실행하는 습관입니다. PHP에서는 두 가지 기본 방법이 있습니다. 하나는 Gearman이라는 프로그램을 사용하는 것이고, 다른 하나는 내가 개인적으로 익숙한 Zend Server 작업 대기열을 사용하는 것입니다. Do you Queue라고하는 방법에 대한 블로그 게시물이 있습니다. 나는 거기에있는 구현이 대단히 사용하기 쉽다는 것을 발견했다.

논리를 실행하기 전에 max_execution_time을 0으로 설정하는 것이 좋습니다.

-1

리디렉션이있는 작은 덩어리로 처리하는 것은 하나의 괴롭힘처럼 보일 수 있지만 어떻게해야합니까?

내포 된 내보내기 메커니즘이 max_execution_time 제한을 초과하기 시작했을 때 전체 포럼 데이터베이스 백업 (phpBB)을 처리 한 것과 같습니다.

한 번에 하나의 테이블을 만들고, 큰 테이블을 5000 개의 행으로 구성했습니다. (전체 프로세스의 제한 요소는 내보내기에 대한 실행 시간이 아니라 실제로 가져 오기에서 phpmyadmin이 처리 할 수있는 파일 크기였습니다.)

내보내기 할 때마다 페이지를 반환했습니다. 헤더의 메타 새로 고침 태그를 사용하여 다음 블록의 테이블 번호와 함께 스크립트를 다시 리디렉션하고 쿼리 문자열에서 시작 행을 지정합니다.

<?php if(!$all_done){ 
    $new_url=$_SERVER['PHP_SELF'].'?tablecount='.$count; 
    if(!$tabledone && ""!=$start_row && null!=$start_row){ 
     $new_url.="&startrow=".$start_row; 
    } else { 
     $new_url.="&startrow=0"; 
    } 
    echo('<meta http-equiv="refresh" content="0.5;url='.$new_url.'" />'); 
} ?> 

카운터는 테이블 이름 배열을 반복 할 수 있도록 표시 테이블을 사용하여 검색했습니다.

거대한 단어 일치 표 (phpBB가 자체적으로 재구성 할 수 있음)를 내보내기에서 제외하기 전에이 백업 스크립트를 완료하는 데 30 분 이상이 소요됩니다.