ホームページ php教程 php手册 PHP でファイルのダウンロードを高速化できるようにする

PHP でファイルのダウンロードを高速化できるようにする

Jun 21, 2016 am 08:51 AM
content header quot

一般的に、ドキュメント ルートの下にあるファイルへの 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 = ベース名($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; filename="' . $filename . '"');

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

readfile($file);

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

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

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

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

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

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

$filename = ベース名($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; filename="' .basename($file) .'"');

//Xsendfile にファイルを送信させます

header("X-Sendfile: $file");

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

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



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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SpringBoot はどのように Feign 呼び出しを通じてヘッダー内のパラメーターを渡しますか? SpringBoot はどのように Feign 呼び出しを通じてヘッダー内のパラメーターを渡しますか? May 16, 2023 pm 08:38 PM

[SpringBoot] Feign 呼び出しを介してヘッダーのパラメーターを渡す Feign を介してヘッダー パラメーターを渡す方法 問題の説明 Feign を使用して Spring Cloud の別のサービスの API インターフェイスをリクエストする場合、ヘッダーでパラメーターを渡す必要があります。特別な処理が行われると、ヘッダー内のパラメータが失われます。解決策 1: @RequestHeader(name="headerName") を介して渡します。例: Feign は次のように定義されます @FeignClient(name="service-name")pub

Linuxヘッダーとはどういう意味ですか? Linuxヘッダーとはどういう意味ですか? Jul 18, 2023 pm 03:34 PM

Linux ヘッダーは、コンテンツに関するメタデータを含めるために使用されるファイルまたはデータ ストリームの先頭を指します。ヘッダー ファイルを正しく記述して使用することで、開発者はシステム リソースをより有効に活用し、コードの可読性と保守性を向上させることができます。

PHP header() メソッドを使用して Web ページを調整する方法 PHP header() メソッドを使用して Web ページを調整する方法 Mar 28, 2023 pm 01:54 PM

PHP は、動的な Web サイトや Web アプリケーションの作成に使用できる強力なプログラミング言語です。最も強力な機能の 1 つは、PHP の header() メソッドです。この記事では、PHP の header() メソッドを使用して Web ページを調整する方法を説明します。

PHPヘッダーにジャンプする方法 PHPヘッダーにジャンプする方法 Dec 02, 2022 am 09:14 AM

PHP ヘッダーでジャンプを実装する方法: 1. "Header("Location:$url");" 構文を使用してジャンプを実装します。 2. "if($_COOKIE[" u_type のようなジャンプ ステートメントを使用して、if 判定を使用してジャンプを実装します) "]){ header('location:register.php'); } else{ setcookie('u_type','1','86400*360');"。

html5タグのヘッドとヘッダーの違いは何ですか? html5タグのヘッドとヘッダーの違いは何ですか? Jan 17, 2022 am 11:10 AM

相違点: 1. head タグは、すべての head 要素のコンテナであるドキュメントの先頭を定義するために使用され、header タグはドキュメントのヘッダー (紹介情報) を定義するために使用されます; 2. すべてのブラウザは、 head タグと古いバージョンのブラウザ どのブラウザも header タグをサポートしていません。header タグをサポートするには、IE9 以降などのブラウザが必要です。

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

PHP ファイル ダウンロード関数の完全なリスト: readfile、ヘッダー、Content-Disposition およびその他の関数のファイル ダウンロード例の分析 PHP ファイル ダウンロード関数の完全なリスト: readfile、ヘッダー、Content-Disposition およびその他の関数のファイル ダウンロード例の分析 Nov 18, 2023 pm 03:26 PM

PHP ファイル ダウンロード関数の完全なリスト: readfile、ヘッダー、Content-Disposition およびその他の関数のファイル ダウンロードの例分析 ファイルのダウンロードは Web アプリケーションの重要な機能の 1 つであり、広く使用されている Web 開発言語としての PHP は、多くの Aファイルのダウンロードを実装する関数とメソッド。この記事では、readfile、header、Content-Dispo など、PHP で一般的に使用されるファイル ダウンロード関数を紹介します。

Nginx がヘッダー内の ID を介して配布する方法 Nginx がヘッダー内の ID を介して配布する方法 May 11, 2023 pm 04:01 PM

Nginx は、リクエスト ヘッダーのカスタム識別子に基づいてリクエストをさまざまなサーバーに分散できます。具体的には、map ディレクティブを使用してリクエスト ヘッダー内のカスタム識別子を別のバックエンド サーバー アドレスにマップし、proxy_pass ディレクティブを使用してリクエストを対応するバックエンド サーバーに転送できます。以下は設定ファイルの例です: http{map$http_my_header$backend{defaultbackend1.example.com;value1backend2.example.com;value2backend3.example.com;}upstreambackend1{serv

See all articles