6

クライアントのウェブサイトには、ほとんどの場合、PHP のサイズ変更スクリプト (GD を使用) があります。アップロードする前に、デジタル カメラから巨大な 7MP 画像のサイズを変更するように何度言っても、彼らはそれを実行しません。その結果、サーバーから「メモリ不足」エラーが発生し、元の画像の解像度が大きすぎるため、画像のサイズが変更されません。

非常に大きな画像のサイズを変更するより良い方法はありますか? これらの大きな画像のサイズを変更するためにスクリプトから利用できる API を提供するサービスはありますか?

4

7 に答える 7

3

Imagemagick を呼び出して PHP ページから画像のサイズを変更できますが、システム コールを許可するとセキュリティ上の問題があります。

どの API も大量のメモリを使用します。PHP の memory_limit も変更できます。

于 2009-08-13T15:48:44.703 に答える
2

私はこの問題で何日も (そして何晩も) 行き詰まりました。

さらに、プロバイダのメモリ制限はそれぞれ異なります。また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'); 

言われているように:

  • env MAGICK_TMPDIR=<tmp_dir>RAMをシミュレートするためのimagemagickの一時ディレクトリを設定します(一種)

  • nice -5プロセスの優先度を変更する UNIX コマンドでもあります ( http://en.wikipedia.org/wiki/Nice_(Unix) ) 。

  • convert ...imagemagickコマンドラインです

本当の取引は約-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); 

存在する場合、バイナリのパスが表示されます。

于 2014-03-21T01:42:45.617 に答える
1

たとえばconvertを使用して、外部プログラムにシェルアウトできます。

于 2009-08-13T15:49:01.457 に答える
1

それらをアップロードしてからサイズ変更ジョブをキューに入れる方法は、コマンドラインphpスクリプトが取得して処理できます(より高速で、別のメモリ制限と実行時間を持つことができます)

于 2009-08-13T15:55:22.633 に答える
1

アップロードする前にサイズを小さくしてください。MAX_FILE_SIZE

于 2009-08-13T16:37:28.373 に答える