ホームページ  >  記事  >  バックエンド開発  >  PHP で X-SendFile ヘッダーを使用してファイルのダウンロードを高速化する_PHP チュートリアル

PHP で X-SendFile ヘッダーを使用してファイルのダウンロードを高速化する_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:29:02725ブラウズ

一般的に言えば、ドキュメント ルートの下にあるファイルへの URL を直接指定することで、ユーザーにファイルをダウンロードさせることができます。

ただし、これを行うと、統計や権限チェックなどを行うことができなくなります。そのため、多くの場合、PHP を使用して転送を行い、ユーザーにファイルのダウンロードを提供します

コードをコピーしますコードは次のとおりです:

$file = "/tmp/dummy.tar.gz";
header("Content-type: application/octet-stream");
header('Content-Disposition :attachment; filename ="' .basename($file) . '"');
header("Content-Length: ". filesize($file));
readfile($file);

しかし問題がありますこれで、つまり、ファイルが中国語の名前の場合、一部のユーザーはダウンロード後にファイル名が文字化けする可能性があります。

それでは、いくつかの変更を加えてみましょう:

コードをコピーします コードは次のとおりです:

$file = "/tmp/中文名.tar.gz";

$filename =basename($ file);

header("Content-type: application/octet-stream");

//中国語ファイル名の処理
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = rawurlencode( $filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition:attachment; filename="' . $encoded_filename . '"');
} else if (preg_match( "/Firefox/ ", $ua)) {
header("Content-Disposition:attachment; filename*="utf8''" . $filename . '"');
} else {
header('Content-Disposition: Attachment; filename= "' . $filename . '"');
}

header("Content-Length: ". filesize($file));
readfile($file);

まあ、見た目はかなり良くなりましたPHP の readfile は可能な限り効率的であり、PHP 自体のメモリを占有しないように努めていますが、実際には MMAP (サポートされている場合) または固定バッファを使用する必要があります。ループでファイルを直接出力します。

出力する場合、Apache + PHP mod の場合は、Apache の出力バッファに送信する必要があります。Nginx + fpm の場合、それらが別々にデプロイされている場合は、追加のネットワークももたらします。イオ

それでは、WebサーバーはPHP層を経由せずにユーザーにファイルを直接送信できますか?

今日、興味深い記事を見つけました: How I PHP: X-SendFile.

Apache のモジュール mod_xsendfile を使用して、Apache がこのファイルをユーザーに直接送信できるようにします:

コードをコピーします コードは次のとおりです:

$file = "/tmp/中文名.tar.gz ";

$filename = basename($file);

header("Content-type: application/octet-stream");

//中国語のファイル名を処理します
$ua = $_SERVER[" HTTP_USER_AGENT"];
$encoded_filename = rawurlencode($filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition:attachment; filename="' . $encoded_filename . '" ');
} else if (preg_match("/Firefox/", $ua)) {
header("Content-Disposition:attachment; filename*="utf8''" . $filename . '"');
} else {
header ('Content-Disposition:attachment; filename="' . $filename . '"');
}

//Xsendfile にファイルを送信させます
header("X-Sendfile: $file");

X-Sendfile ヘッダー Apache によって処理され、応答ファイルはクライアントに直接送信されます。

Lighttpd と Nginx にも同様のモジュールがありますので、興味があればチェックしてみてください

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/779166.html技術記事一般的に、ドキュメント ルートの下にあるファイルへの URL を直接指定することで、ユーザーにファイルをダウンロードさせることができます。ただし、この方法では、統計や権限のチェックを行う方法はありません...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。