PHP가 대용량 파일을 보낼 수 없는 문제에 대한 해결 방법: 1. "Ranges:(unit=first byte pos)-[last byte pos]"와 같은 구문을 사용하여 Range 매개변수를 설정합니다. 2. "Content-Range"를 설정합니다. 3. " GET /test.rar HTTP/1.1 Connection: close Host: 116.1.219.219" 요청을 전달하여 전체 파일을 다운로드합니다.
이 튜토리얼의 운영 환경: Windows 10 시스템, PHP 버전 8.1, DELL G3 컴퓨터
PHP에서 대용량 파일을 보낼 수 없으면 어떻게 해야 합니까?
초대형 파일 업로드를 위한 PHP 솔루션
1. 개요
이명 이력서 업로드는 실제로 다운로드를 의미합니다. 즉, 파일을 다운로드한 위치에서 계속 다운로드하는 것입니다. 이전 버전의 HTTP 프로토콜에서는 중단점이 지원되지 않았지만 HTTP/1.1부터 지원되었습니다. 일반적으로 Range 및 Content-Range 엔터티 헤더는 중단점 다운로드에만 사용됩니다. HTTP 프로토콜 자체는 중단점 업로드를 지원하지 않으며 직접 구현해야 합니다.
2. 범위
는 요청 헤더에서 첫 번째 바이트의 위치와 마지막 바이트의 위치를 지정하는 데 사용됩니다. 일반적인 형식은 다음과 같습니다.
범위: 클라이언트-대-에 사용됩니다. 서버 요청의 경우 필드를 변경하여 다운로드된 파일의 특정 섹션의 크기와 단위를 지정할 수 있습니다. 바이트 오프셋은 0부터 시작됩니다. 일반적인 형식:
Ranges: (unit=first byte pos)-[last byte pos] Ranges: bytes=4000- 下载从第4000字节开始到文件结束部分 Ranges: bytes=0~N 下载第0-N字节范围的内容 Ranges: bytes=M-N 下载第M-N字节范围的内容 Ranges: bytes=-N 下载最后N字节内容
1. 다음 사항에 유의해야 합니다.
(1) 이 데이터 간격은 닫힌 간격이고 시작 값은 0이므로 "Range: bytes=0"과 같은 요청이 발생합니다. -1"은 실제로 위의 요청 시작 부분에 있는 2바이트입니다.
(2) "Range: bytes=-200", 이는 파일 시작 부분에서 201바이트를 요청한다는 의미가 아니라 파일 끝 부분에서 200바이트를 요청한다는 의미입니다.
(3) 마지막 바이트 pos가 첫 번째 바이트 pos보다 작으면 이 Range 요청은 잘못된 요청입니다. 서버는 이 Range 요청을 무시한 다음 200으로 응답하고 전체 파일을 클라이언트에 보내야 합니다.
(4) 마지막 바이트 pos가 파일 길이보다 크거나 같으면 이 Range 요청은 만족할 수 없는 것으로 간주되며 서버는 416, Requested range not satisfiable로 응답해야 합니다.
2. 설명 예:
는 처음 500바이트를 나타냅니다. bytes=0-499
는 두 번째 500바이트를 나타냅니다. bytes=500-999
는 마지막 500바이트를 나타냅니다. bytes=- 500
은 500바이트 이후의 범위: bytes=500-
첫 번째 및 마지막 바이트: bytes=0-0,-1
동시에 여러 범위 지정: bytes=500-600,601-999
3. 내용 -Range
는 응답 헤더에서 전체 엔터티 중 일부의 삽입 위치를 지정하는 데 사용됩니다. 또한 전체 엔터티의 길이를 나타냅니다. 서버가 클라이언트에 부분 응답을 반환하기 전에 응답에 포함되는 범위와 전체 엔터티 길이를 설명해야 합니다. 일반 형식:
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
IV. 헤더 예시
전체 파일 다운로드 요청:
GET /test.rar HTTP/1.1 Connection: close Host: 116.1.219.219 Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头
일반 정상 응답
HTTP/1.1 200 OK Content-Length: 801 Content-Type: application/octet-stream Content-Range: bytes 0-800/801 //801:文件总大小
중단점 재개의 가장 간단한 구현에 대해
1. 클라이언트는 1024K 파일을 다운로드하며 그 중 512K가 다운로드되었습니다
2. 네트워크가 중단되고 클라이언트가 전송 재개를 요청하므로 해당 파일을 HTTP 헤더에 선언해야 합니다.
Range:bytes=512000-
이 헤더는 파일의 512K 위치에서 파일 전송을 시작하도록 서버에 알립니다
3. 서버는 중단점 재개 요청을 수신하고 파일의 512K 위치에서 전송을 시작합니다. HTTP 헤더와 이때 서버에
Content-Range:bytes 512000-/1024000
를 추가합니다. 반환된 HTTP 상태 코드는 200이 아닌 206이어야 합니다.
그러나 실제 시나리오에서는 터미널이 재개 요청을 시작할 때 서버 측에서 URL에 해당하는 파일 내용이 변경되어 재개 데이터가 잘못된 상황이 발생합니다. 이 문제를 해결하는 방법? 분명히 이때 파일의 고유성을 식별하는 방법이 필요합니다. RFC2616에는 파일의 마지막 수정 시간을 식별하기 위해 Last-Modified를 구현하는 것과 같은 해당 정의도 있으므로 파일이 다시 시작될 때 파일이 수정되었는지 여부를 확인할 수 있습니다. 동시에 RFC2616은 ETag 헤더를 사용하여 파일의 MD5 값과 같은 파일의 고유 식별자를 배치할 수도 있습니다.
서버가 파일 변경 사항을 식별하는 데 도움이 되도록 재개 요청을 시작할 때 터미널은 HTTP 헤더에 If-Match 또는 If-Modified-Since 필드를 선언해야 합니다.
또한 RFC2616도 If-Range 헤더를 정의하고 있으며, 단말은 전송을 재개할 때 If-Range를 사용합니다. If-Range의 내용은 처음 수신된 ETag 헤더이거나 Last-Modfied의 마지막 수정 시간일 수 있습니다. 서버는 재개 요청을 받으면 If-Range의 내용을 확인합니다. 확인 결과가 일치하면 206 재개 응답을 반환하고, 일치하지 않으면 서버는 200 응답을 반환하며 응답 내용은 완전히 새로운 것입니다. 파일.
추천 학습: "PHP 비디오 튜토리얼"
위 내용은 대용량 PHP 파일을 보낼 수 없으면 어떻게 해야 하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!