2012-04-17 9 views
2

私はいくつかの画像をアップロードできる小さなCMSをコーディングしています。 これらの画像は、imagemagickでの3つのバージョン(ビッグ、ミッドアンドサムネイルサイズ)に変換されます。imagemagickで写真を作成するのが遅すぎます。改善方法?

問題は、imagemagickが(アップロードされた)4枚の写真の3つのバージョンを作成するのに5分かかることです。ここ

はImageMagickのコマンドで一部です:

foreach($upIMGS as $key => $filename){ 
    list($width, $height) = getimagesize($path.$filename); 
    if ($width > $height) $size = "x96"; 
    else $size = "96x"; 

    exec(P_IMAGEMAGICK." ".$path.$filename." -resize $size -gravity center -crop 96x96+0+0 +repage ".$path."th-".$filename); 
    exec(P_IMAGEMAGICK." ".$path.$filename." -resize 320x320 ".$path."hl-".$filename); 
    exec(P_IMAGEMAGICK." ".$path.$filename." -resize 514x ".$path."fl-".$filename); 

    unlink($path.$filename); 
} 

[$ upIMGSは最近アップロードされた画像のすべてのファイル名を持つ配列である]

私は...それが仕事をして意味が、遅くなり、5分後にサーバーが私にエラーを与えます。いくつかのファイルが生成され、一部は生成されません。

私にヒントを与えることができれば非常にいいです。

+0

は奇妙に聞こえるあなたは問題を隔離しようとすることができ、他のものより実質的に遅い3のいくつかのあなたは何をコマンド・ライン・アイテムを試している場合は1ずつ。?? - 別に1つ?サーバーは、undあまりにも重い荷物? – Edu

+0

OK。私は最初に(アップロードされた4つの)画像の生成されたバージョンが直ちに作成されることを知りました。しかし、他のもの(第2、第3、第4)は長い時間がかかります... –

+0

おそらくImageMagickの新しいインスタンスが変換ごとに開始され、最初の3つが高速であれば、私にはコードが問題です。あなたにそれを正確に示すことはできません。 : – Edu

答えて

6

私は最近、同じ問題に走ったが、私は私だけではなく、コマンドラインのPHPクラスimagickを使用していますが、私はカット300xbestFitまたはbestFitx300

に、元の2592x1944からそれらのサイズを変更するには、一度画像を通過しました私の場合、半分の時間は-scaleまたはscaleImageに変更します。ここに私のテストコードのスニペットがあります。

while ($images = readdir($handle)) { 
    // check to see if the first or second character is a '.' or '..', 
    // if so then remove from list 
    if (substr($images,0,1) != '.') { 
     //Check files to see if there extensions match any of the following image extensions. 
     // GLOB_BRACE looks for all glob criteria within the {braces} 
     $images = glob($dir."{*.gif,*.jpg,*.png,*.jpeg}", GLOB_BRACE); 
     // the glob function gives us an array of images 
     $i = 0; 
     foreach ($images as $image) { 
      // parse the data given and remove the images/ $dir, 
      // imagemagick will not take paths, only image names. 
      $i++; 
      list ($dir, $image) = split('[/]', $image); 
      echo $i, " ", $image, "<br />"; 

      $magick = new Imagick($dir."/".$image); 
      $imageprops = $magick->getImageGeometry(); 

      if ($imageprops['width'] <= 300 && $imageprops['height'] <= 300) { 
       // don't upscale 
      } else { 

       // 29 Images at 2592x1944 takes 11.555036068 seconds -> 
       // output size = 300 x 255 
       $magick->scaleImage(300,300, true); 

       // 29 Images at 2592x1944 takes 23.3927891254 seconds -> 
       // output size = 300 x 255 
       //$magick->resizeImage(300,300, imagick::FILTER_LANCZOS, 0.9, true); 
       $magick->writeImage("thumb_".$image); 

      } 
     } 
    } 
} 

私は2592x1944の29枚の画像を処理し、11.555036068秒に23.3927891254秒から行ったのです。私はこれが役立つことを願っています

編集:私は、私はちょうどImageMagick v6 Examples -- API & Scriptingに、役に立つかもしれません以下、へへ走った上で言ったことに加えて

:。

  • 「シェルスクリプトは、本質的に低速であることこれはもちろん、 複数のステップとディスクへの余分なファイル処理が必要です。これはもちろん、 新しいIM v6オプションの処理のおかげで、 の多数の画像処理操作を1つのカンマで行うことができますnd。でも ので、あなたはめったにあなたが頻繁にあなたが望むものを達成するために複数のコマンドを使用する必要が 単一convertのコマンドですべてを行いませんので、できることができます。「

  • を」大や画像のさえ多数を読んだとき、それは IMは彼らが は、このようにそのメモリ要件を削減する、完全な画像に読み取らないよう、Read Modifier にリサイズを使用するか、またはそれらをトリミング。「

  • 」あなたはApacheモジュールとしてのImageMagickを呼び出した場合、それはまた、意志へのより良いです部品が一度ロードされ、のために利用可能なので、 の起動時間を短縮してください複数回の再ロードを繰り返す必要はありません。これは 恒久的に実行している 「デーモン」IMプロセスと将来的にはより実用的になることがあります。」

2

待機していますか?アップロードした3枚の写真から12枚の写真を作成するのに5分かかることはありません。

残りのコードは表示されませんが、あなたのgetimagesizeパスは$ pathですが、$ unlink_posts。$ value?彼らが違う理由はありますか?とにかく$ valueはforeach()ループで定義されていません。おそらく、スクリプトがハングアップするバグがあります。私はImageMagickを使用しましたが(exec()ではなく、実際のクラスで)、非常に高速でした。

foreach loop()で診断を実行しましたか?ミリ秒単位で出力するのと同様に、それらのexec()コマンドのそれぞれを実行するのに必要な時間です。

+0

申し訳ありません、私は変数名を変更しました。(私は理解のために変更しました) –

0

小さなトリックは、最初に最大の画像を作成してから、オリジナルではなく次の画像を作成することです。

しかし、とにかく12枚の画像では5分が多すぎるようです。
いくつかの調査が必要です。

  • ソースが比較的小さい(たとえば1024x768)場合、サイズ変更にかなりの時間がかかりますか?
  • シェルから直接呼び出される同じ時間がかかりますか?

遅延が避けられない場合は、サイズ変更機能を専用サーバーに移動し、キューに入れて、単純なAJAXスニペットでプロセスを確認したい場合があります。

+0

私はあなたのトリックを試しました( "これ以降の画像を作成する")...それは本当にそれを速くすることはありません。私が使用しているサイズは "1000x665"、 "3400x2000"、 "1840x1200"、 "2130x1500"です。 –

3

、それは他の画像を作るためにメモリにメインイメージをロードし、その上で動作するように、この例では、役立つかもしれません:。

$cmd = " input.jpg \(-clone 0 -thumbnail x480 -write 480_wide.jpg +delete \)". 
" \(-clone 0 -thumbnail x250 -write 250_wide.jpg +delete \) ". 
" \(-clone 0 -thumbnail x100 -write 100_wide.jpg +delete \) -thumbnail 64x64! null: "; 
exec("convert $cmd 64_square.jpg "); 

これは、4枚の異なるサイズの画像を作成している

関連する問題