私はこの問題で何日も (そして何晩も) 行き詰まりました。
さらに、プロバイダのメモリ制限はそれぞれ異なります。またmemory_limit
、PHP の変更は共有サーバーでは機能しません。プロバイダーは通常、phpinfo()
128Mo を取得したと言っても RAM を制限します (たとえば、1and1 は RAM をプロセスごとに 60Mo に制限します)。
しかし、私はついにここで非常に効率的なものを見つけました: http://www.imagemagick.org/Usage/files/#massive
が必要imagemagick
ですが、ほとんどのプロバイダーがサーバー上でこれをネイティブに提供していることを発見しました。
exec('env MAGICK_TMPDIR=<tmp_dir> nice -5 convert -limit memory 32 -limit map 32 -resize 800x600 huge.jpg reasonable.jpg');
言われているように:
本当の取引は約-limit memory 32
と -limit map 32
です。これは、バイナリ (ここでは : 32Mo) が使用するメモリを制限する方法です。おそらく、サーバーの値に一致するように値を合わせる必要があります (通常、PHP は、致命的なエラーが発生したときに、割り当てられた最大メモリを通知します。快適にするために、この値を 2 または 4 で割ることをお勧めします)。
また、付随的な問題を回避するために、PHP に他の行をいくつか追加する必要がありました。
ignore_user_abort(true); // ignore user abort : let the script finish resizing even if user aborts
set_time_limit(0); // ignore server timeout
putenv('MAGICK_THREAD_LIMIT=1'); // limit the number of thread for the binary. Very important in my case
それがすべて役立つことを願っています...
サーバーで が利用可能かどうかを知るにconvert
は、これを (PHP で) 試すことができます。
$out = array();
exec('which convert 2>&1', $out);
print_r($out);
存在する場合、バイナリのパスが表示されます。