ホームページ > バックエンド開発 > PHPチュートリアル > ダウンロードを高速化するために LAMP スタックで大きな ZIP ファイルをストリーミングする方法

ダウンロードを高速化するために LAMP スタックで大きな ZIP ファイルをストリーミングする方法

Barbara Streisand
リリース: 2024-11-08 02:42:02
オリジナル
680 人が閲覧しました

How to Stream Large Zip Files on LAMP Stack for Faster Downloads?

LAMP スタック上の大きなファイルのオンザフライ ZIP ファイルの作成

問題:

ユーザーがダウンロードするために複数の大きなファイルの zip ファイルを作成する場合、従来の方法では CPU とディスクの使用率が高くなるため、初期段階で重大なパフォーマンスの問題が発生します。

ストリーミングを使用した解決策:

この問題に対処するには、popen() または proc_open() を使用して zip のストリーミング機能を利用し、zip コマンド パイプラインを実行し、stdout を PHP ストリームとして取得します。これを Web サーバー プロセスと組み合わせることで、zip ファイルをその場で作成しながらユーザーにストリーミングできます。

popen() を使用した実装:

<?php
// Set necessary headers
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename="file.zip"');

// Execute zip command and retrieve stdout as a stream
$fp = popen('zip -r - file1 file2 file3', 'r');

// Read and echo data in chunks
$bufsize = 65535;
$buff = '';
while (!feof($fp)) {
    $buff = fread($fp, $bufsize);
    echo $buff;
}
pclose($fp);
?>
ログイン後にコピー

最適化のヒント:

  • 適切なバッファ サイズ (コメントで Benji が提案した 8192 など) を使用します。
  • マジック クオートをオフにする必要に応じて。
  • 最適なパフォーマンスを得るために mb_http_output('pass') を設定します。
  • 適切なコンテンツ関連ヘッダーを使用します。

    • Content-Type: application/zip
    • Content-disposition: 添付ファイル; filename="file.zip"

残念ながら、このコンテキストでストリーミングまたは不明なコンテンツの長さを示すヘッダーを設定するのは簡単ではありません。

flush() に関する注意:

読み取り/エコー ループ内で flash() を呼び出すと、Apache の内部出力バッファーがオーバーランするため、大きなファイルや低速ネットワークで問題が発生する可能性があることに注意することが重要です。したがって、コード内での flash() 呼び出しを省略することが最善です。

以上がダウンロードを高速化するために LAMP スタックで大きな ZIP ファイルをストリーミングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート