ホームページ  >  記事  >  バックエンド開発  >  PHP でファイル ダウンロード コードをより速く提供できるようにする_PHP チュートリアル

PHP でファイル ダウンロード コードをより速く提供できるようにする_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:18:14811ブラウズ

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

コードをコピーします

$file = "/tmp/dummy.tar.gz";
header("Content-type: application/octet-stream");性質: filename= "' .basename($file) . '"');
readfile($file);これには問題があります。つまり、ファイルが中国語の名前の場合、ファイル名が文字化けしてダウンロードされる可能性があります

そこで、いくつかの修正を加えてみましょう (参考: :


コードをコピーします

)。コードは次のとおりです:
$file = "/tmp/中国語名.tar.gz"; $filename =basename($file);
header("Content-type: application/octet -stream");
//中国語ファイル名の処理
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20" , $encoded_filename);
if (preg_match("/MSIE/", $ua )) {
header('Content-Disposition:attachment; filename="' . $encoded_filename . '"'); ("/Firefox/", $ua)) {
header("Content-Disposition:attachment; filename*="utf8''" . $filename . '"')
} else {
header('Content-Disposition : 添付ファイル名="' . $ファイル名 . '"');
}
header('Content-Disposition: 添付ファイル; ファイル名="' . $ファイル名 . '"');
ヘッダー("コンテンツの長さ: " . filesize($file));
readfile($file);


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

Apache + PHP mod の場合、出力時に、最後に、Nginx + fpm の場合は、追加のネットワーク IO ももたらすため、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 = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_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-Disposition:attachment; .basename($file).'"');
//Xsendfile にファイルを送信させます


X-Sendfile ヘッダーは Apache によって処理され、応答ファイルはクライアントに直接送信されます
Lighttpd と Nginx にも同様のモジュールがありますので、興味がある場合はチェックしてください。



http://www.bkjia.com/PHPjc/325558.html

www.bkjia.com
tru​​e

http://www.bkjia.com/PHPjc/325558.html技術記事

ただし、これを行うと、統計や権限チェックなどを行うことができなくなります。そのため、多くの場合、PHP を使用して転送を行い、ユーザーにファイルのダウンロードを提供します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。