php 대용량 파일 다운로드

이 스크립트를 사용 하면 PHP에서 파일을 다운로드 하는 데 도움이 MB와 GBs에 어떤 문제와 파일을 다운로드할 수 있습니다. readfile ()은 파일 파일을 출력 하는 간단한 방법입니다. 출력 버퍼링 및 기타 미묘한 것 들-역사적으로 그것은 몇 가지 성능 문제가 있 었 문서는 메모리 문제가 주장 하는 동안, 실제 시나리오가 다를 구걸. 바이트 범위를 지원 해야 하는 경우에 관계 없이 여전히 구식 방식으로 출력 해야 합니다. 헤더 (` HTTP/1.1 206 부분 내용 `); 헤더 (` 수락-범위: 바이트 `); 헤더 (“내용 범위: 바이트 $start-$end/$filesize”); $content _length = $end-$start + 1; 헤더 (“내용-길이: $length”); <? php 함수 파일 ($filePath) (! 빈 ($filePath)) {$fileInfo = pathinfo ($filePath); $fileName = $fileInfo [` basename `]; $fileExtnesion = $fileInfo [` 확장 `]; $default _contenttype = "응용 프로그램/8 진수 스트림"; $content _typ_ 목록 = mimtypes (); 경우 (array_key_exists ($fileExtnesion, $content _tyt_list)) {$contentType = $content _tyt_list [$fileExtnesion];} 다른 {$contentType = $default _contenttype;} 경우 (file_exists ($filePath)) {$size = 파일 크기 ($filePath); $offset = 0; $length = $size; 경우 (isset ($ _server [` HTTP_RANGE `])) {preg_match (`/바이트 = (d +)-(d +)?/`, $ _ 서버 [` HTTP_RANGE `], $matches); $offset = intval ($matches [1]); $length = intval ($matches [2])-$offset; $fhandle = fopen ($filePath, ` r `); fseek ($fhandle, $offset); $data = fread ($fhandle, $length); fclose ($fhandle); 헤더 (` HTTP/1.1 206 부분 내용 `); 헤더 (` 내용 범위: 바이트 `. $offset. `-` . ($offset + $length). `/` . $size); }//heasers 다운로드 헤더에 대 한 ("내용-처리: 첨부 파일; 파일 이름 =". $fileName); 헤더 (` 내용 유형: `.

$contentType); 헤더 (“수락-범위: 바이트”); 헤더 (“Pragma: public”); 헤더 (“만료:-1”); 헤더 (“캐시 제어: 캐시 없음”); 헤더 (“캐시-제어: 공개, 해야-revalidate, 사후 검사 = 0, 사전 확인 = 0”); 헤더 (“내용-길이:”. 파일 크기 ($filePath)); $chunksize = 8 * (1024 * 1024); 8 메가바이트 (가능한 가장 높은 fread 길이) 경우 ($size > $chunksize) {$handle = fopen ($ _ 파일 [“파일”] [“tmp_name”], ` rb `); $buffer = ` `; 동안 (! ($handle) & & (connection_status () = = CONNECTION_NORMAL)) {$buffer = fread ($handle, $chunksize); 인쇄 $buffer; ob_flush (); 플러시 (); } 경우 (connection_status ()! = = CONNECTION_NORMAL) {에코 “연결 중단”;} fclose ($handle); } 다른 사람 {ob_clean (); 플러시 (); readfile ($filePath);}} 다른 {에코 ` 파일이 존재 하지 않습니다! `;}} 다른 사람 {에코 ` 다운로드 할 파일이 없습니다! `;}} ? > 두 시나리오 모두에서 대용량 파일을 읽어야 합니다. 첫 번째, 우리는 데이터가 무엇 인지 알고 있어야 합니다. 두 번째, 우리는 데이터가 무엇 인지 상관 하지 않습니다. 이 옵션 들의 탐험 … file_get_contents를 사용 하 여 () 수 있습니다 그것은 최고의 choise 아니지만, 작은 파일을 완벽 하 게 작동 합니다. 주요 단점은 파일 내용을 변수에 저장할 때 메모리의 메모리가 예약 된다는 것입니다. 두 코드 예제는 좋은 속도 (80 메가바이트/s)와 손상 된 파일이 있지만 내 프로덕션 서버에서 작동 하는 것 같습니다. 내 마지막 코드: 우리가 효율적으로 파일을 읽을 걸릴 수 있는 많은 접근이 있습니다.

그러나 또한 우리가 그들을 사용할 수 있는 두 가지 가능성이 시나리오가 있습니다. 우리는 읽고 처리 데이터를 출력 하거나 우리가 읽은 것을 기반으로 다른 작업을 수행, 동시에 데이터를 읽기 및 처리 할 수 있습니다. 또한 데이터에 액세스할 필요 없이 데이터 스트림을 변환할 수도 있습니다. 이 솔루션을 너무 많이 주셔서 감사 합니다, 그것은 나를 위해 뿐만 아니라 작동 확인. 매우 유사한 스크립트를 사용 하 고 있었는데 파일을 약 200mb의 서버를 전송, 때로는 90mb 때로는 120mb 또는 어디 든 지 하지만 다운로드를 완료 하지 따라 무작위로 장소에서 파일을 드롭 다운 것이 크기. 이제 우리는 다운로드 파일 () 함수를 호출 하 고 파일을 다운로드할 경로를 다운로드 전달: 이 코드는 약간 이상 합니다.