Web サービスでは、ダウンロード用に大量のファイルの ZIP を作成すると、リソースが大量に消費される可能性があります。従来のアプローチでは、一時 zip ファイルを作成し、それをユーザーにエコーするか、ディスクに保存します。ただし、この方法では次のような問題が発生します。
別のアプローチは、Linux コマンドライン ツール zip のストリーミング機能を利用することです。 ls -1 | のようなパイプライン コマンドを使用します。 zip - @ - |猫> file.zip、zip はストリーミング モードで動作できるため、メモリ使用量が最小限に抑えられます。このコンテキストにおけるパイプはバッファとして機能します。バッファがいっぱいになると、オペレーティング システムは書き込みプログラムを一時的に停止します。これにより、付随するプログラムの書き込み速度に合わせたペースで 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 サイトの他の関連記事を参照してください。