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); ?>
最適化のヒント:
適切なコンテンツ関連ヘッダーを使用します。
残念ながら、このコンテキストでストリーミングまたは不明なコンテンツの長さを示すヘッダーを設定するのは簡単ではありません。
flush() に関する注意:
読み取り/エコー ループ内で flash() を呼び出すと、Apache の内部出力バッファーがオーバーランするため、大きなファイルや低速ネットワークで問題が発生する可能性があることに注意することが重要です。したがって、コード内での flash() 呼び出しを省略することが最善です。
以上がダウンロードを高速化するために LAMP スタックで大きな ZIP ファイルをストリーミングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。