2012-02-27 1 views
2

SSH 액세스 권한이없는 서버에서 매우 큰 아카이브 파일을 untar/unzip해야합니다. 우리의 대안 중 하나는 PHP를 통해 파일의 압축을 풀기 위해 시스템 명령을 실행하는 것입니다.PHP를 사용하여 시스템 명령을 긴 제한 시간으로 실행 하시겠습니까?

문제는 파일을 압축 해제/압축 해제하는 데 꽤 오래 걸리는 것입니다. PHP는 완료되기 전에 시간 초과됩니다.

PHP 스크립트가 시간 초과되는지 여부에 관계없이 untar 명령을 완전히 실행하는 방법이 있습니까? 비동기 실행처럼?

또는 파일을 압축 해제 할 수있는 충분한 시간을 가질 수 있도록 PHP 시간 초과 기간을 어떻게 극단적으로 설정할 수 있습니까?

set_time_limit(0); 
ini_set('max_execution_time', 0); 

set_time_limitmax_execution_time를 참조하십시오 : 서버 구성이 값을 수정하지 못하도록하지 않는 경우

+0

리눅스 시스템입니까? afaik, 리눅스에서 시스템 명령에 소요 된 시간은 max_execution_time 한도로 계산되지 않습니다. 어쩌면 그것은 약간의 타임 아웃이 설정된 httpd 일 것입니다. –

+0

Ditto, Linux 시스템입니까? 공유 된 웹 호스팅 플랫폼에 있습니까? 파일을 비동기 적으로 압축 해제 할 수있는 cronjobs (공유 호스팅에서는 흔하지 않음)를 정의하고 실행할 수 있습니다. 한 번 또는 사용자가 압축 파일을 업로드 할 때마다 파일의 압축을 풀어야합니까? 한 번만 작동한다면 copmress/uncompress 기능이있는 파일 관리자가있는 웹 제어판에 액세스 할 수 있거나 파일을 압축 해제하도록 서버 관리자에게 요청하는 것이 더 쉽습니다. – juanrpozo

+0

예, Linux입니다. Rackspace 클라우드 사이트. –

답변

1

을 종료 할 때까지 PHP 스크립트는 outfile.txt를 스캔 할 수 :

set_time_limit() 함수와 설정 지시어 max_execution_time을 만 영향 스크립트 자체의 실행 시간. 스크립트가 실행 중일 때 최대 시간을 결정할 때 system(), 스트림 작업, 데이터베이스 쿼리 등을 사용하는 시스템 호출과 같은 스크립트의 실행 실행 외부에서 발생하는 모든 시간은 포함되지 않습니다. 측정 된 시간이 실제 인 Windows 에서는 그렇지 않습니다.

클라이언트 (브라우저)가 시간 초과 될 수 있습니다. 이러한 연결 해제로 인해 스크립트가 중단 될 수 있습니다. 이를 예방하려면 다음을 수행하십시오.

ignore_user_abort(true); 

그러면 진행 상황을 확인할 수있는 두 번째 스크립트가 필요합니다. 하나의 아이디어는 파일에 tar 출력을 작성하여 두 번째 스크립트가 완료되었는지 확인할 수있는 것입니다. 다른 하나는 차례로 tar을 실행하는 쉘 스크립트를 호출하는 것입니다. 이 셸 스크립트는 반환 코드를 확인하고 결과가있는 파일을 만지거나 작동하는 동안 기본 잠금 파일을 만들 수 있습니다.

+0

답해 주셔서 감사합니다.그것은 다른 스크립트가 명령의 상태를 확인할 수 있도록 지속적으로 업데이트되도록 파일에 리눅스 명령을 출력 할 수 있습니까? 왜냐하면 내가 아는 바에 따르면,'# command> output.txt'를 사용하면 명령이 완료 될 때까지 파일에 쓰지 않기 때문입니다. –

+0

내 경험에 비추어 볼 때,이 파일은 전체에 쓰여져 언제든지 확인할 수 있습니다. – webbiedave

+0

답변을 환영합니다. 그러나 upvote는 그것을 더 잘 말할 것입니다;) – webbiedave

0

이 그것을해야한다.

0

서버가 * nix 시스템에서 실행되는 경우 nohup 명령을 사용할 수 있습니다. 즉

nohup tar ... >outfile.txt 

그런 다음 작업이 manual에서

관련 문제