Lösung für das Problem, dass PHP keine großen Dateien senden kann: 1. Stellen Sie den Range-Parameter mit einer Syntax wie „Ranges:(unit=first byte pos)-[last byte pos]“ ein. 2. Legen Sie „Content-Range“ fest; 3. Übergeben Sie die Anforderung „GET /test.rar HTTP/1.1 Connection: close Host: 116.1.219.219“, um die gesamte Datei herunterzuladen.
Die Betriebsumgebung dieses Tutorials: Windows 10-System, PHP-Version 8.1, DELL G3-Computer
Was soll ich tun, wenn PHP keine großen Dateien senden kann?
PHP-Lösung zum Hochladen sehr großer Dateien
1. Übersicht
Der sogenannte Lebenslauf-Upload bezieht sich eigentlich nur auf das Herunterladen, also das Fortsetzen des Herunterladens an der Stelle, an der die Datei heruntergeladen wurde. Haltepunkte wurden in früheren Versionen des HTTP-Protokolls nicht unterstützt, werden aber seit HTTP/1.1 unterstützt. Im Allgemeinen werden die Entitätsheader „Range“ und „Content-Range“ nur für Haltepunkt-Downloads verwendet. Das HTTP-Protokoll selbst unterstützt das Hochladen von Haltepunkten nicht und muss von Ihnen selbst implementiert werden.
2. Bereich
wird im Anforderungsheader verwendet, um die Position des ersten Bytes und die Position des letzten Bytes anzugeben:
Bereich: wird für Client-zu- verwendet. Bei Serveranfragen können Sie die Größe eines bestimmten Abschnitts der heruntergeladenen Datei und ihre Einheit angeben, indem Sie das Feld ändern. Der Byte-Offset beginnt bei 0. Typisches Format:
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. Folgende Punkte müssen beachtet werden:
(1) Dieses Datenintervall ist ein geschlossenes Intervall und der Startwert ist 0, also eine Anfrage wie „Bereich: Bytes=0 -1" ist eigentlich Oben sind die 2 Bytes am Anfang der Anfrage.
(2) „Bereich: Bytes=-200“, bedeutet nicht, dass 201 Bytes am Anfang der Datei angefordert werden, sondern dass 200 Bytes am Ende der Datei angefordert werden.
(3) Wenn die Position des letzten Bytes kleiner als die Position des ersten Bytes ist, ist diese Range-Anfrage eine ungültige Anfrage. Der Server muss diese Range-Anfrage ignorieren, dann mit einer 200 antworten und die gesamte Datei an den Client senden.
(4) Wenn die Position des letzten Bytes größer oder gleich der Dateilänge ist, gilt diese Bereichsanforderung als nicht erfüllbar und der Server muss mit 416, Angeforderter Bereich nicht erfüllbar, antworten.
2. Beispielerklärung:
stellt die ersten 500 Bytes dar: Bytes=0-499
stellt die zweiten 500 Bytes dar: Bytes=500-999
stellt die letzten 500 Bytes dar: Bytes=-500
der Bereich nach 500 Bytes: Bytes=500-
Das erste und letzte Byte: Bytes=0-0,-1
Mehrere Bereiche gleichzeitig angeben: Bytes=500-600,601-999
3. Inhalt -Range
wird im Antwortheader verwendet, um die Einfügeposition eines Teils der gesamten Entität anzugeben. Außerdem wird die Länge der gesamten Entität angegeben. Bevor der Server eine Teilantwort an den Client zurücksendet, muss er den von der Antwort abgedeckten Bereich und die gesamte Entitätslänge beschreiben. Allgemeines Format:
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
IV. Header-Beispiel
Anforderung zum Herunterladen der gesamten Datei:
GET /test.rar HTTP/1.1 Connection: close Host: 116.1.219.219 Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头
Allgemeine normale Antwort
HTTP/1.1 200 OK Content-Length: 801 Content-Type: application/octet-stream Content-Range: bytes 0-800/801 //801:文件总大小
Über die einfachste Implementierung der Haltepunktwiederaufnahme As folgt:
1. Der Client lädt eine 1024-KB-Datei herunter, von der 512 KB heruntergeladen wurden.
2 Das Netzwerk ist unterbrochen und der Client fordert die Fortsetzung der Übertragung an. Daher muss das Fragment im HTTP-Header deklariert werden Das muss dieses Mal fortgesetzt werden:
Range:bytes=512000-
Dieser Header benachrichtigt den Server, mit der Übertragung der Datei ab der 512-KB-Position der Datei zu beginnen
3. Der Server empfängt die Haltepunkt-Wiederaufnahmeanforderung und startet die Übertragung ab der 512-KB-Position der Datei und fügt Folgendes hinzu:
Content-Range:bytes 512000-/1024000
zum HTTP-Header und zu diesem Zeitpunkt des Servers. Der zurückgegebene HTTP-Statuscode sollte 206 und nicht 200 sein.
Aber in tatsächlichen Szenarien wird es eine Situation geben, das heißt, wenn das Terminal eine Wiederaufnahmeanforderung initiiert, hat sich der der URL entsprechende Dateiinhalt auf der Serverseite geändert und die Wiederaufnahmedaten müssen falsch sein. Wie kann dieses Problem gelöst werden? Offensichtlich benötigen wir zu diesem Zeitpunkt eine Methode, um die Einzigartigkeit der Datei zu identifizieren. Es gibt auch entsprechende Definitionen in RFC2616, z. B. die Implementierung von Last-Modified, um den Zeitpunkt der letzten Änderung einer Datei zu identifizieren, sodass Sie feststellen können, ob Änderungen aufgetreten sind, wenn die Datei fortgesetzt wird. Gleichzeitig definiert RFC2616 auch einen ETag-Header. Sie können den ETag-Header verwenden, um die eindeutige Kennung der Datei zu platzieren, beispielsweise den MD5-Wert der Datei.
Das Terminal sollte das Feld „If-Match“ oder „If-Modified-Since“ im HTTP-Header deklarieren, wenn es eine Fortsetzungsanforderung initiiert, um dem Server bei der Identifizierung von Dateiänderungen zu helfen.
Darüber hinaus definiert RFC2616 auch einen If-Range-Header, und das Terminal verwendet If-Range, wenn es die Übertragung wieder aufnimmt. Der Inhalt in If-Range kann der ursprünglich empfangene ETag-Header oder der Zeitpunkt der letzten Änderung in Last-Modfied sein. Wenn der Server die Wiederaufnahmeanforderung empfängt, überprüft er den Inhalt im If-Range. Wenn die Überprüfung konsistent ist, gibt er eine 206-Wiederaufnahmeantwort zurück. Wenn sie inkonsistent ist, gibt der Server eine 200-Antwort zurück und der Antwortinhalt ist vollständig neu Datei.
Empfohlenes Lernen: „PHP-Video-Tutorial“
Das obige ist der detaillierte Inhalt vonWas soll ich tun, wenn ich eine große PHP-Datei nicht senden kann?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!