12

ユーザーが生成した画像がかなり大きくなるフォルダーがあります。これらを圧縮しようとすると、約 1.5 ギガ サイズの zip ファイルでエラーが発生します。

私の質問はメモリに関係しており、php が zip を開いた状態とメモリ内のすべての画像の両方を保持していると思います。私が持っている可能な解決策は、適切なフォルダーに加えて、アップロード時に各画像をzipファイルに送信することです。これはこれまでのところ機能しているようですが、zipファイルのサイズの制限は、約4 GBです。これはサーバーの RAM の量にどのように影響/相互作用しますか?\ 制限は実際には 4 GB ですか、それとも zip にファイルを無期限に追加し続けることができますか、またはスクリプトで zip のサイズをチェックし、それが X を超えているかどうかを確認する必要がありますギグは名前を変更し、新しい zip を作成します。Google を検索してドキュメントを読みましたが、矛盾する情報や不完全な情報が見つかったので、決定的な回答とアドバイスを探しています。ありがとう

4

3 に答える 3

16

それでも PHP ZipArchiveを使用したい場合は、特定のサーバー/OS の制限を回避するためにできることがいくつかあります。

  • メモリあなたのケースでは明らかなように思えるかもしれませんが、addFromString を使用して新しいファイルをアーカイブに追加するZipArchiveの使用方法に関する多くの例を見てきました。しないでください!これにより、ファイルを開いてそのコンテンツを保存するためにメモリが割り当てられます。これにより、メモリがすぐに不足します。代わりにaddFileを使用してください。また、必要のないメモリをすべて解放してください。

  • 実行時間php.ini またはini_setを使用して、スクリプトの最大実行時間を増やします(たとえばini_set('max_execution_time', 600);、最大実行時間を 10 分にします)。

  • ファイル ハンドル一部の OS では、開いているファイルの数に制限があり、問題が発生する可能性があります。これは、PHP が zip ファイルを閉じた後にのみファイルを zip に追加するためです。開いているファイルの数の問題を防ぐために、x ファイルごとに (たとえば 1000 ごとに) zip ファイルを閉じて再度開くと、PHP はアーカイブに既に割り当てられているファイルを圧縮して追加するように強制されます。

  • ファイル サイズOS のファイル サイズの制限がある場合があります。ファイルが大きいほど、PHP はそれを管理するためにより多くのメモリを必要とするため、個人的には最大ファイル サイズを使用することを好み、その後はインデックス番号を使用して新しい zip ファイルを開きます。 . 正確なファイル サイズが問題にならない場合は、アーカイブに入るファイルのサイズをカウントし、特定の制限に達したら切り替えるか、x ファイルごとにアーカイブを閉じてディスク上のサイズを確認して、新しいアーカイブを開始するかどうかを決定します (アーカイブを閉じるとファイルが圧縮されることに注意してください)

個人的には、アーカイブに入るファイルのサイズを取得し、アーカイブの最大サイズにいつ到達するかを確認するために圧縮係数を適用してファイルサイズを制限するのが好きです (jpg ファイル ~0.9、zip ファイル = 1、テキスト ファイル~0.10, ...) そして次のボリュームに切り替えます。

于 2014-03-25T15:19:58.003 に答える