ホームページ >php教程 >PHP开发 >Apache サイトから大きなファイルのダウンロードが不完全になる理由と解決策

Apache サイトから大きなファイルのダウンロードが不完全になる理由と解決策

黄舟
黄舟オリジナル
2016-12-21 11:34:362378ブラウズ

今日ローカルで JQuery プラグインをテストしていましたが、ブラウザーは JQuery ファイルの x 行目に「}」が欠落しているというメッセージを表示し続けました。

最初はjsファイルに問題があるのではないかと思い、公式サイトからJQueryを再ダウンロードしましたが、やはり同じ問題が発生し、再度コードを確認しましたが、問題はありませんでした。

そこでFirefoxでテストしてみたところ、同じエラーが発生しました。そこでFireBugを使ってHTTPリクエストを確認したところ、すべて200件だったので問題ありませんでした。

しかし、jqueryファイルをリクエストした応答結果を見ると、ファイルは不完全で、元のファイルのほんの一部しか返されていないことがわかりました。

次に、Thunderを使用して、要求されたアドレスからjsファイルをダウンロードします。ダウンロードされたファイルのサイズも正しいですが、ファイルの末尾が異なることがわかりました。元のファイルと一部のコードが欠落していますが、返送されたファイルは元のファイルの一部にすぎないことがわかりました。その後、小さなファイルをいくつかダウンロードしましたが、問題はありませんでしたが、100KBを超えるファイルなど、少し大きなファイルはダウンロードが不完全でした。このような問題に遭遇したのは初めてでしたので、Baidu と Google を使用して問題を解決するしかありませんでした。 Apache の設定の問題であることが判明しました。解決策は次のとおりです。

Apache の設定ファイル httpd.conf の 内の EnableSendfile の後の値を Off に変更するだけです。
この項目がない場合は、自分で追加します: EnableSendfile Off。上のブロックに忘れずに入れてください。そうしないと、Apache が起動しません。
気にしない場合は、EnableMMAP の後の値を Off に設定してみてください。

原因分析:

デフォルトでは、リクエストを処理し、ファイル内のデータにアクセスする必要がないとき (静的ファイルコンテンツの送信など)、オペレーティングシステムがサポートしていれば、Apache はsendfile を使用してファイルの内容を送信します。 ファイルを読み取らずにクライアントに直接送信します。この sendfile メカニズムにより、個別の読み取り操作と書き込み操作、およびバッファー割り当てが回避されます。これはデフォルトでオンになっているため、一部のオペレーティング システムでは sendfile システム コールが十分にサポートされていません。そのため、一定の容量を超えるHTMLページは送信できないように見えます。オフにしても通常の使用には影響しません。

EnableSendfile コマンドと EnableMMAP コマンドについて

EnableSendfile コマンド


説明: オペレーティング システム カーネルの sendfile サポートを使用して、ファイルをクライアントに送信します
構文: EnableSendfile On|Off
デフォルト値: EnableSendfile On

このディレクティブは、httpd がオペレーティング システム カーネルの sendfile サポートを使用してクライアントにファイルを送信できるかどうかを制御します。デフォルトでは、ファイル内のデータへのアクセスを必要としないリクエスト(静的ファイルコンテンツの送信など)を処理するとき、オペレーティングシステムがサポートしていれば、Apache はファイルコンテンツを読み込まずに sendfile を使用してクライアントに直接送信します。ファイル。 。翻訳者注: Linux2.4/2.6 カーネルはどちらもこれをサポートしています。
この sendfile メカニズムは、個別の読み取りおよび書き込み操作とバッファ割り当てを回避しますが、一部のプラットフォームまたは一部のファイル システムでは、いくつかの問題を回避するためにこの機能を無効にすることが最善です:
一部のプラットフォームでは、コンパイル システムによって検出されないエラーが発生する可能性があります。欠陥のある sendfile サポート。特に、現在欠陥のある sendfile サポートを備えているプラ​​ットフォーム上で、他のプラットフォームでクロスコンパイルされたバイナリを実行する場合。
Linux で IPv6 が有効になっている場合、sendfile を使用すると、一部のネットワーク カードで TCP チェックサム オフロードのバグが発生します。
Linux が Itanium プロセッサで実行されている場合、sendfile は 2GB を超えるファイルを処理できない場合があります。
ネットワーク (NFS や SMB など) 上に NFS ファイル システムがマウントされている DocumentRoot の場合、カーネルは独自のバッファを通じてネットワーク ファイルを確実に提供できない可能性があります。
上記の状況が発生した場合は、sendfile を無効にする必要があります:
EnableSendfile Off
NFS または SMB の場合、このコマンドはディレクトリの設定によって上書きできます:
EnableSendfile Off < /Directory>


EnableMMAP コマンド


説明: メモリ マッピング (メモリ マッピング) を使用して配信時のファイルを読み取る
構文: EnableMMAP On|Off
デフォルト値: EnableMMAP On

このディレクティブは、配信中にファイルの内容を読み取る必要がある場合にメモリ マッピングを使用できるかどうかを httpd に指示します。サーバー側分析に mod_include を使用するファイルを配信するときなど、ファイル内のデータへのアクセスが必要なリクエストを処理するとき、オペレーティング システムがサポートしている場合、Apache はデフォルトでメモリ マッピングを使用します。
このメモリ マッピングによりパフォーマンスが向上する場合がありますが、場合によっては、オペレーティング システムの問題を回避するためにメモリ マッピングを無効にする必要がある場合があります。
一部のマルチプロセッサ システムでは、メモリ マッピングにより httpd のパフォーマンスが一部低下します。
NFS マウントされた DocumentRoot 上で、ファイルがメモリ マップされている場合、ファイルを削除または切り詰めると、セグメンテーション違反により httpd がクラッシュします。
これらの問題が発生する可能性があるサーバー構成中に、次のコマンドを使用してメモリ マッピングを無効にする必要があります:
EnableMMAP Off
NFS でマウントされたフォルダの場合、メモリ マッピングを無効にするように個別に指定できます:
EnableMMAP Off

上記は、Apache サイトから大きなファイルのダウンロードが不完全になる理由と解決策です。関連コンテンツの詳細については、PHP 中国語 Web サイト (www. php.cn )!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。