私は80Mの最大memory_limitを与えるWebホスティングを持っています(つまり、ini_set( "memory_limit"、 "80M");)。関数 imagecreatefromjpeg(); を使用する写真のアップロードを使用しています。大きな画像をアップロードすると、「致命的なエラー: 83886080 バイトの許容メモリ サイズが使い果たされました」というエラーが表示されます。ユーザーに制限できる画像の最大サイズ (バイト単位) は? または、memory_limitは他の要因に依存しますか?
2 に答える
のメモリ サイズは8388608
80 ではなく 8 メガバイトです。どこかで値を増やすことができるかどうかを確認することをお勧めします。
それ以外の場合、画像操作の一般的なルールは、少なくとも
image width x image height x 3
イメージをロードまたは作成するためのメモリのバイト数。(赤に 1 バイト、緑に 1 バイト、青に 1 バイト、場合によってはアルファ透明度にもう 1 バイト)
このルールにより、640 x 480 ピクセルの画像には、少なくとも 9.2 メガバイトのスペースが必要になります。これには、スクリプト自体が占有するオーバーヘッドとスペースは含まれません。
JPG は可変圧縮率の圧縮形式であるため、JPG ファイル サイズの上限をバイト単位で特定することはできません。画像の解像度を調べて、それに制限を設定する必要があります。
利用可能なメモリがそれほど多くない場合は、タイリング (一度に画像の一部を処理する) や、プロバイダーが許可している場合は、外部のImageMagickのようなツール(これもメモリを消費しますが、PHP スクリプトのメモリ制限外です)。
おそらく、スクリプトは画像自体よりも多くのメモリを使用します。メモリ消費量のデバッグを試みています。
手っ取り早い方法の 1 つは、コードの特定のポイント、特にカスタムのerror_handlerとshutdown_functionで memory_get_usage とmemory_get_usage memory_get_peak_usageを利用することです。これにより、どの操作がメモリ不足を引き起こしているのかを正確に知ることができます。