2012-09-07 2 views
0

shell_exec 명령을 사용하여 파일을 다른 서버로 FTP 전송할 수 있습니다. 이는 공유 서버 fastCGI가 시간 종료되기 때문입니다. 그래서 다른 명령을 사용할 수 없습니다.PHP에서 shell_exec을 사용하여

어떻게 구현합니까? 나는 DOS 창에서 내 PC에 스크립트를 테스트하고 작동하지만, 서버에서 코드를 사용하여 :

ftp: s: unknown option 

배치 파일은 다음과 같습니다 :

나는 다음과 같은 오류가

$output = shell_exec('ftp -s:ftpscript.txt'); 
echo "<pre>$output</pre>"; 

open ftp.server.com 
usernamex 
passwordx 
hash 
cd incoming 
binary 
ls 

아이디어가 있으십니까?

배경 : PHP를 사용하여 Amazon AWS Glacier로 파일을 업로드하지만 크기가 큰 파일 (750Mb)이 시간 초과되고 fastCGI (?) 시간 초과로 인해 500 내부 서버 오류가보고됩니다. FTP를 사용하여 큰 파일을 업로드하는 방법을 찾아야합니다. 스트림 작업에 소요되는 시간은 스크립트의 시간 제한에 포함되지해야하기 때문에 * nix에서 스크립트에

앙드레

답변

0

ftp:// 래퍼의 사용은 시간 제한을 발생할합니다. 스크립트가 시간 초과되지 않게하려면 스크립트 상단에 set_time_limit(0);을 호출 해보십시오.

Ref

는 :

Note:

The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system() , stream operations, database queries, etc. is not included when determining the maximum time that the script has been running. This is not true on Windows where the measured time is real.

또한 브라우저가 전송이 완료되는 동안 열려 유지해야하므로 HTTP를 통해 호출 스크립트에서 FTP를 통해 750메가바이트 파일을 전송하는 것은 좋은 해결책이 아니라는 것을 주목해야한다. 아마도 cron 작업을 사용하여 전송을 수행하거나 HTTP 요청을 사용하여 전송을 비동기 적으로 시작해야합니다.

실용적인 솔루션이 아닌 경우 shell_exec() 방식으로 실행중인 문제는 Windows와 * nix FTP 프로그램의 차이점입니다.

서버에 명령 행 cURL 바이너리가 있습니까? 인터페이스가 플랫폼과 상관없이 표준이므로 사용 가능하다면 훨씬 더 나은 옵션입니다. 또한 스크립트를 사용할 필요가 없으며 명령 줄 인수로 거의 모든 것을 수행 할 수 있습니다.

는 예를 들어 위의 코드는이 명령에 응축 될 수있다 :

$output = shell_exec('curl ftp://usernamex:[email protected]/incoming/'); 
echo "<pre>$output</pre>"; 

이 스크립트에서 hash 명령을 무시하지만 여기 당신의 목표는 디렉토리 목록을 가져올 경우 프로그램이 옵션을 필요가 없습니다 .

로컬 서버 here에서 테스트 할 수있는 Windows cURL 바이너리를 얻을 수 있습니다. here을 찾을 수있는 컬을 명령 줄 이진의 사용을

Win32 7.27.0 binary SSL SSH Dirk Paehl 

전체 문서 : 난 당신 같은 태그 파일을 (꽤 방법 페이지 아래의) 사용하는 것이 좋습니다 아마 것입니다.

+0

Dreamhost의 참고 사항 : 스크립트가 웹 브라우저를 통해로드되면 큰 파일에서 시간이 초과되는 것처럼 보이는 fastcgi 제한 사항이 적용됩니다.여기서 문제는 공유 호스팅 서버에서 fastcgi 시간 초과를 수정할 수 없도록하는 것입니다. 쉘 명령 행에서 스크립트를 수행하면 오류 메시지가 표시되지 않습니다. – andrebruton

+0

@andrebruton 컬 커맨드 라인 바이너리를 제공하지 않습니까? 또한, 웹 브라우저에서이 작업을 수행 할 필요가 있습니까 (브라우저가 대기하는 대신 웹 브라우저에서 처리하고 프로세스를 분리하는'exec()'PHP 스크립트를 사용할 수 없습니까? 파일이 다운로드됩니까?) – DaveRandom

+0

코드 작성 방법에 대한 아이디어가 있습니까? 실제 사례? 웹 페이지에서 전송 만 할 수 있으며, 내가 아는 다른 액세스는 불가능합니다 ... – andrebruton