개발 프로세스 중에 큰 파일을 다운로드해야 할 필요가있을 때 PHP의 readFile () 함수를 사용하는 것은 간단하지만 대형 파일의 경우 전체 파일 출력을 직접 읽으면 과도한 메모리 사용 또는 오버플로가됩니다. 따라서 프로그램 안정성과 사용자 경험을 보장하기 위해보다 효율적인 다운로드 솔루션을 채택해야합니다.
Breakpoint Continution을 사용하면 완성 된 부품을 반복적으로 다운로드하지 않고 다운로드가 중단 된 후 사용자가 인터럽트 위치에서 계속 다운로드 할 수 있습니다. 이는 특히 네트워크 환경이 불안정 할 때 대역폭을 절약 할뿐만 아니라 다운로드 신뢰성 및 사용자 만족도를 향상시킵니다.
먼저 $ _get을 사용하여 클라이언트가 전달한 파일 경로 매개 변수를 얻고 Basename () 함수를 사용하여 파일 이름을 추출하여 디렉토리 교차와 같은 보안 위험을 피하십시오.
$file = $_GET['file'];
$filename = basename($file);
콘텐츠 유형을 Application/Octet-stream 으로 설정하여 이진 파일 스트림이라고 브라우저에 알려줍니다. 또한 첨부 파일 다운로드 및 파일 이름을 나타내도록 컨텐츠 분할 헤더를 설정하십시오.
요청 헤더의 http_range 에 따르면, 다운로드 시작 위치는 구문 분석되고 파일 포인터는 fseek ()을 사용하여 조정되어 중단 점 연속 전송을 달성합니다.
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
if (isset($_SERVER['HTTP_RANGE'])) {
$range = $_SERVER['HTTP_RANGE'];
preg_match('/bytes=(\d+)-/', $range, $matches);
$start = intval($matches[1]);
fseek($file, $start);
}
파일 컨텐츠를 통해 루프를 통해 매번 특정 크기 (예 : 4096 바이트)의 버퍼를 읽고 점차 브라우저로 점차 출력하고 출력 버퍼를 새로 고쳐서 데이터의 적시 전송을 보장하십시오.
$buffer_size = 4096;
while (!feof($file)) {
echo fread($file, $buffer_size);
ob_flush();
flush();
}
위의 방법을 통해 PHP는 대형 파일 처리에서 전통적인 readfile () 함수의 단점을 해결하여 초대형 파일의 중단을 효율적으로 지원할 수 있습니다. 개발자는 사용자 경험을 더욱 향상시키기 위해 다운로드 진행 상황 디스플레이, 속도 제한 제어 및 기타 기능을 구현할 수 있습니다.
HTTP 프로토콜의 범위 헤더 및 PHP 파일 작동 기능의 합리적인 사용은 다운로드 서비스를보다 안정적이고 유연하게 만들 수 있으며 다양한 실용적인 비즈니스 시나리오에 적합합니다.