Heim >php教程 >PHP开发 >Gründe und Lösungen für den unvollständigen Download großer Dateien von der Apache-Site

Gründe und Lösungen für den unvollständigen Download großer Dateien von der Apache-Site

黄舟
黄舟Original
2016-12-21 11:34:362374Durchsuche

Heute habe ich ein JQuery-Plugin lokal getestet, aber der Browser meldete immer wieder, dass „}“ in Zeile x der JQuery-Datei fehlte.

Zuerst dachte ich, es gäbe ein Problem mit der js-Datei, also habe ich JQuery erneut von der offiziellen Website heruntergeladen, aber ich hatte immer noch das gleiche Problem, habe mir den Code noch einmal angesehen und keine Probleme festgestellt.

Also habe ich es mit Firefox getestet und den gleichen Fehler erhalten. Also habe ich FireBug verwendet, um die HTTP-Anfragen zu überprüfen, und es waren alle 200, also gab es kein Problem.

Aber als ich mir das Antwortergebnis der Anforderung der JQuery-Datei ansah, stellte ich fest, dass die Datei unvollständig war und nur ein kleiner Teil der Originaldatei zurückgegeben wurde.

Verwenden Sie dann Xunlei, um die js-Datei von der angeforderten Adresse herunterzuladen. Die Größe der heruntergeladenen Datei ist jedoch auch korrekt, nachdem ich sie mit einem Editor geöffnet habe Die Datei unterscheidet sich von der Originaldatei. Nach dem Hinzufügen von Code stellt sich heraus, dass die zurückgeforderte Datei nur ein Teil der Originaldatei ist. Dann habe ich mehrere kleinere Dateien heruntergeladen und festgestellt, dass es kein Problem gab. Etwas größere Dateien, z. B. Dateien über 100 KB, wurden jedoch unvollständig heruntergeladen. Dies war das erste Mal, dass ich auf ein solches Problem stieß. Mir blieb nichts anderes übrig, als Baidu und Google zu verwenden, um das Problem zu finden. Es stellt sich heraus, dass es sich um ein Konfigurationsproblem mit Apache handelt:

Ändern Sie einfach den Wert nach EnableSendfile im -Block in Apaches Konfigurationsdatei httpd.conf auf Aus.
Wenn Sie dieses Element nicht haben, fügen Sie es selbst hinzu: EnableSendfile Off Denken Sie daran, es in den Block oben einzufügen, sonst startet Apache nicht.
Wenn es keine Rolle spielt, können Sie versuchen, den Wert nach EnableMMAP auf Aus zu setzen.

Ursachenanalyse:

Es stellt sich heraus, dass bei der Verarbeitung einer Anfrage standardmäßig kein Zugriff auf die Daten in der Datei erforderlich ist (z. B. beim Senden einer statischen Datei). Wenn das Betriebssystem dies unterstützt, verwendet Apache sendfile, um den Dateiinhalt direkt an den Client zu senden, ohne die Datei zu lesen. Dieser Sendedateimechanismus vermeidet separate Lese- und Schreibvorgänge sowie die Pufferzuweisung. Da es standardmäßig aktiviert ist, unterstützen einige Betriebssysteme den Systemaufruf sendfile nicht ausreichend. Daher scheint es, dass HTML-Seiten, die eine bestimmte Kapazität überschreiten, nicht übertragen werden können. Das Ausschalten hat keinen Einfluss auf den normalen Gebrauch.

Über den Befehl „EnableSendfile“ und den Befehl „EnableMMAP“

Befehl „EnableSendfile“


Hinweis: Verwenden Sie die Sendfile-Unterstützung von der Betriebssystemkernel So senden Sie eine Datei an den Client
Syntax: EnableSendfile On|Off
Standardwert: EnableSendfile On

Diese Direktive steuert, ob httpd die Sendfile-Unterstützung des Betriebssystemkernels zum Senden von Dateien verwenden kann an den Kunden. Standardmäßig verwendet Apache bei der Verarbeitung einer Anforderung, die keinen Zugriff auf die Daten in der Datei erfordert (z. B. das Senden eines statischen Dateiinhalts), sofern das Betriebssystem dies unterstützt, sendfile, um den Dateiinhalt ohne Lesen direkt an den Client zu senden die Datei. Anmerkung des Übersetzers: Beide Linux2.4/2.6-Kernel unterstützen dies.
Dieser Sendfile-Mechanismus vermeidet separate Lese- und Schreibvorgänge sowie die Pufferzuweisung. Auf einigen Plattformen oder Dateisystemen ist es jedoch am besten, diese Funktion zu deaktivieren, um einige Probleme zu vermeiden:
Einige Plattformen verfügen möglicherweise über eine unzureichende und fehlerhafte Kompilierungssystemerkennung Sendfile-Unterstützung, insbesondere wenn Binärdateien, die durch Cross-Compilation auf anderen Plattformen erhalten wurden, auf Plattformen ausgeführt werden, die derzeit über eine mangelhafte Sendfile-Unterstützung verfügen.
Wenn IPv6 unter Linux aktiviert ist, löst die Verwendung von sendfile auf einigen Netzwerkkarten einen TCP-Prüfsummen-Offload-Fehler aus.
Wenn Linux auf einem Itanium-Prozessor läuft, kann sendfile möglicherweise keine Dateien verarbeiten, die größer als 2 GB sind.
Bei einem DocumentRoot mit einem über das Netzwerk gemounteten NFS-Dateisystem (z. B. NFS oder SMB) ist der Kernel möglicherweise nicht in der Lage, Netzwerkdateien zuverlässig über seinen eigenen Puffer bereitzustellen.
Wenn die obige Situation auftritt, sollten Sie sendfile deaktivieren:
EnableSendfile Off
Für NFS oder SMB kann dieser Befehl durch die Einstellung für das Verzeichnis überschrieben werden:
EnableSendfile Off


EnableMMAP-Befehl


Beschreibung: Speicherzuordnung im Versand zum Lesen verwenden Dateien
Syntax: EnableMMAP On|Off
Standardwert: EnableMMAP On

Diese Direktive weist httpd an, ob es die Speicherzuordnung verwenden kann, wenn es den Inhalt einer Datei während der Übermittlung lesen muss. Bei der Bearbeitung einer Anfrage, die Zugriff auf Daten in einer Datei erfordert, beispielsweise beim Bereitstellen einer Datei, die mod_include für die serverseitige Analyse verwendet, verwendet Apache standardmäßig die Speicherzuordnung, sofern das Betriebssystem dies unterstützt.
Diese Art der Speicherzuordnung führt manchmal zu Leistungsverbesserungen, aber in einigen Fällen müssen Sie die Speicherzuordnung möglicherweise deaktivieren, um einige Betriebssystemprobleme zu vermeiden:
Auf einigen Multiprozessorsystemen verringert die Speicherzuordnung die Leistung von httpd .
Wenn auf einem NFS-gemounteten DocumentRoot eine Datei einer Speicherzuordnung unterzogen wurde, führt das Löschen oder Abschneiden der Datei zum Absturz von httpd aufgrund eines Segmentierungsfehlers.
Während der Serverkonfiguration, bei der diese Probleme auftreten können, sollten Sie den folgenden Befehl verwenden, um die Speicherzuordnung zu deaktivieren:
EnableMMAP Off
Für NFS-gemountete Ordner können Sie individuell angeben, dass die Speicherzuordnung deaktiviert werden soll:
EnableMMAP Off

Das Obige ist der Grund und die Lösung für den unvollständigen Download großer Dateien von der Apache-Site, weitere verwandte Bitte achten Sie darauf Für Inhalte besuchen Sie die chinesische PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn