7

PHP GD 画像ライブラリがメモリ不足になるのを防ぐ方法はありますか? 大きすぎる画像をアップロードすると、GD がメモリ不足になり、スクリプトが終了する傾向があります。キャッチ可能な例外またはそれを拡張する何かをスローしたいのですが、残念ながらそうではありません。

現在、最初に を発行する石畳のスクリプトを使用していますini_set('memory_limit', '128M')。サーバーの構成によってはそれが不可能な場合もあるため、必要なメモリの量を推定しようとするアルゴリズムに戻ります (解像度、色深度、チャネル、およびファッジ ファクターを考慮に入れる)。memory_get_usage()関数が存在する場合、そうでない場合は大まかな見積もりを行います。

これまでのところすべてが機能していますが、エレガントとはほど遠いものであり、いくつかのエッジケースでは失敗するでしょう. これを行うためのより良い方法はありますか?つまり、すべてを停止させるのではなく、必要に応じて GD を適切に失敗させることはできますか?

4

6 に答える 6

3

メモリを買い増し!:-P

真剣に、あなたが行うアクションはより多くのメモリを必要とするため、メモリ不足を処理することは不可能です.

最善の策は、現在のメモリ設定に基づいて、アップロードする画像のサイズを制限することです。

于 2009-07-13T02:40:20.287 に答える
2

画像を作成した後。

imagepng($image);
imagedestroy($image);

メモリの問題を取り除きます

于 2012-04-18T17:58:51.373 に答える
1

gd各関数に必要なメモリ量を確認するためにいくつかのテストを行います。

  • imagecreatetruecolorが必要なようですwidth*height*5 bytes

  • imagepngが必要なようですwidth*height*4 bytes

于 2012-06-28T01:23:10.370 に答える
1

「メモリ不足」や「PHP の致命的なエラー: 8388608 バイトの許容メモリ サイズが使い果たされました (… バイトを割り当てようとしました)」などの PHP の致命的なエラーをキャッチするには、こちらを参照してください: http://php.net/manual/en/ function.set-error-handler.php#88401

于 2009-08-11T15:52:18.840 に答える
1

別の方法もありますが、画像編集プロセスの特定の部分が何度も繰り返されるため、時間がかかる場合がありますが、メモリ制限を推定値に設定してから、画像の処理を試みることができます。失敗した場合は、例外をキャッチし、メモリ制限を増やしてから、画像を再度処理します-成功するか、特定のメモリ制限に達するまでこれを繰り返します-その時点で、ユーザーに画像が大きすぎることを説明するエラーメッセージをスローします使用する。

編集: メモリ不足エラーをキャッチするには、次のソリューションを使用できます: http://au2.php.net/set_error_handler#35622

于 2009-07-14T01:11:54.323 に答える
0

最善の策は、必要な RAM の量を把握しようとするのをやめて、最初から最大にすることです。4 GB の空き容量がある場合は、イメージ スクリプトに 2 ~ 4 GB 程度を使用するように指示します。スクリプトが終了したら、通常の状態に戻します。これにより、致命的な可能性のあるすべての状況がカバーされます。とにかくそれが私が考えることができる唯一の「フェイルセーフ」な方法です...

于 2009-07-13T06:51:21.080 に答える