PHP でファイルのダウンロードを高速化できるようにする
一般的に、ドキュメント ルートの下にあるファイルへの 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 によって処理され、応答ファイルはクライアントに直接送信されます。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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