2013-01-20 2 views
2

현재 사용자가 파일을 선택하여 다운로드 할 수 있도록 다음 PHP 함수를 사용하고 있습니다. 이것은 FTP를 통해 발생합니다. 그러나 사용자가 큰 파일을 선택하면 다운로드가 진행되는 동안 다른 요청에 대해 서버가 잠 깁니다. PHP가 요청에 계속 응답하는 동안 파일을 호스팅 할 수있는 방법이 있습니까?PHP 대용량 파일을 올바르게 호스팅하는 방법은 무엇입니까?

사용자가 자격 증명을 사용하여 파일을 다운로드 할 수 있도록 PHP가 필요하므로 자산으로 호스팅 할 수 없습니다. 파일은 FTP 서버에 있습니다.

function download($file) { 
    $fileStream = ""; 
    if($this->get($file)) { 
     //Send header to browser to receive a file 
     header("Content-disposition: attachment; filename=\"$file\""); 
     header("Content-type: application/octet-stream"); 
     header("Pragma: "); 
     header("Cache-Control: no-cache"); 
     header("Expires: 0"); 

     $data = readfile($this->downloadDir . $file); 
     $i=0; 
     while ($data[$i] != "") 
     { 
      $fileStream .= $data[$i]; 
      $i++; 
     } 
     unlink($this->downloadDir . $file); 
     echo $fileStream; 
     exit; 
    } else { 
     return false; 
    } 
} 
+0

무슨 일이 일어나고

(당신이 content-type 및 content-disposition 헤더를 유지할 수 있도록 다른 헤더는 유지됩니다)? – alex

+0

죄송합니다. $ this-> get ($ file)이 서버의 tmp 폴더로 다운로드한다는 것을 잊어 버렸습니다. 그런 다음 사용자에게 제공합니다. FTP 서버가 웹 서버와 동일한 네트워크에 있기 때문에 tmp 폴더로 다운로드하는 것이 거의 즉시 발생합니다. –

+0

@drdanielfc는'mod_xsendfile'을 사용합니다. https://tn123.org/mod_xsendfile/ – Petah

답변

1

PHP는 이러한 종류의 작업에 가장 적합한 솔루션은 아니지만 사용중인 웹 서버에 작업을 위임 할 수 있습니다. 파일이 응용 프로그램과 같은 위치에 있으므로이 작업이 가능합니다.

일반적으로 PHP 응용 프로그램 (Apache, lighttpdnginx)을 실행하는 모든 주요 웹 서버는 XSendfile을 모두 지원합니다.

아파치 :

를 사용하려면 먼저 웹 서버의 기능 (웹 서버 각각에 대해 위의 링크를 확인), 다음 스크립트에 새로운 헤더를 추가를 활성화해야

header("X-Sendfile: $location_of_file_to_download"); 

이 Lighttpd :

header("X-LIGHTTPD-send-file: $location_of_file_to_download"); 

의 nginx :

header("X-Accel-Redirect: $location_of_file_to_download"); 

웹 서버는 응용 프로그램에서이 헤더를 포착하고 PHP 응답의 본문을 파일로 대체합니다. 그리고이 파일을 사용자에게 제공하는 동안 PHP는 차단 해제되고 새로운 사용자를 서버에 준비가됩니다. FTP를 통해

1

PHP는 단일 스레드이므로 각 요청에 대해 구조를 만들어야합니다. 그런 다음 한 번에 하나의 요청을 처리하는 대신 구조를 반복하여 천천히 처리해야합니다 (몇 백 킬로바이트를 하나 보내고 그 다음으로 이동하는 등).

솔직히 PHP는이 작업을 수행하는 데 적합한 언어로 들리지 않습니다. 왜 vsftp 같은 FTP 서버를 만들었습니까?

+0

FTP 서버의 프론트 엔드가 있어야합니다. FTP 서버에 자격 증명이 필요하기 때문에 사용자를 FTP 다운로드 위치로 리디렉션 할 수도 없습니다. –

관련 문제