ホームページ  >  記事  >  バックエンド開発  >  リソースを圧迫せずに PHP で大きな ZIP ファイルをストリーミングする方法

リソースを圧迫せずに PHP で大きな ZIP ファイルをストリーミングする方法

DDD
DDDオリジナル
2024-11-07 21:02:02654ブラウズ

How to Stream Large Zip Files in PHP Without Resource Overwhelm?

リソースを圧迫せずに、その場で大きなファイルの .Zip を作成する

Web サービスでは、ダウンロード用に大量のファイルの ZIP を作成すると、リソースが大量に消費される可能性があります。従来のアプローチでは、一時 zip ファイルを作成し、それをユーザーにエコーするか、ディスクに保存します。ただし、この方法では次のような問題が発生します。

  • 初期リソースのスパイク: ファイル作成フェーズ中の CPU とディスク使用量の急増
  • ダウンロード遅延: アーカイブの完了を待っているユーザーにとって顕著な遅延。
  • 過剰なメモリ フットプリント: ファイル処理中の大量のメモリ消費。
  • ディスクスペース使用率: ファイルストレージ用の一時ディスクスペースの作成。
  • キャンセル時のリソースの無駄: ユーザーがダウンロード中にキャンセルすると、初期段階で消費されたすべてのリソースが無駄になります。

リソース消費の克服

別のアプローチは、Linux コマンドライン ツール zip のストリーミング機能を利用することです。 ls -1 | のようなパイプライン コマンドを使用します。 zip - @ - |猫> file.zip、zip はストリーミング モードで動作できるため、メモリ使用量が最小限に抑えられます。このコンテキストにおけるパイプはバッファとして機能します。バッファがいっぱいになると、オペレーティング システムは書き込みプログラムを一時的に停止します。これにより、付随するプログラムの書き込み速度に合わせたペースで zip が動作するようになります。

PHP を使用した Zip ファイルのストリーミング

PHP を使用して LAMP スタックで同じストリーミング メカニズムを実現するには、次のようにします。 Popen() または proc_open() 関数を利用して zip コマンドを実行できます。コマンドからの stdout は、PHP ストリームとして取得できます。これらの手法を組み合わせることで、次のコード スニペットは、作成中の zip ファイルをユーザーにストリーミングする方法を示しています。

header('Content-Type: application/octet-stream');
header('Content-disposition: attachment; filename="file.zip"');

$fp = popen('zip -r - file1 file2 file3', 'r');
$bufsize = 8192;
$buff = '';

while(!feof($fp)) {
   $buff = fread($fp, $bufsize);
   echo $buff;
}
pclose($fp);

このコードは、一時的なストレージやストレージを必要とせずに、zip ファイルをクライアントに直接ストリーミングします。過剰なメモリ消費。これは、bash スニペットの cat コマンドの機能を効果的にエミュレートします。

以上がリソースを圧迫せずに PHP で大きな ZIP ファイルをストリーミングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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