5

ディレクトリ内の写真のサムネイルを作成するスクリプトがあります。しかし、実行に時間がかかりすぎます (ディレクトリ内の約 170 の画像)。

スクリプトは ajax リクエストによって呼び出されます。70% 完了した後、おそらくタイムアウトが原因でエラーが発生します (約 3 ~ 4 分かかります)。

この問題を解決するにはどうすればよいですか?

function createThumbs( $pathToImages, $pathToThumbs, $thumbWidth ) 
{
 // open the directory
 $dir = opendir( $pathToImages );

 // loop through it, looking for any/all JPG files:
while (false !== ($fname = readdir( $dir ))) {
// parse path for the extension
$info = pathinfo($pathToImages . $fname);
// continue only if this is a JPEG image
if ( strtolower($info['extension']) == 'jpg' ) 
{

  // load image and get image size
  $img = imagecreatefromjpeg( "{$pathToImages}{$fname}" );
  $width = imagesx( $img );
  $height = imagesy( $img );

  // calculate thumbnail size
  $new_width = $thumbWidth;
  $new_height = floor( $height * ( $thumbWidth / $width ) );

  // create a new temporary image
  $tmp_img = imagecreatetruecolor( $new_width, $new_height );

  // copy and resize old image into new image 
  imagecopyresampled( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height );

  // save thumbnail into a file
   imagejpeg( $tmp_img, "{$pathToThumbs}thumb_{$fname}" );
   }
  }
   // close the directory
  closedir( $dir );
  }

  createThumbs($directory,$directory."/thumbs/",150);

ajax 呼び出し;

   var ajaxr=$.ajax({
  type: "POST",
  url: "after_upload.php",
  timeout:600,
  beforeSend: function() {
  $("#result").html('<div align="center"><h2>מבצע עיבוד נתונים יקח זמן ,חכה..תכין קפה בנתיים      ותעשן סיגריה</h2><div><img src="loader.gif"/><div dir="rtl" style="margin:15px;">טוען מידע וממיר תמונות... <button id="cancel" style="padding:5px;">בטל פעולה ותחזור חזרה [X]</button></div></div>  </div>');
                        },
  success: function(data){
       $("#result").html(data);
  },
  error: function(xhr, textStatus, errorThrown) {
                             $("#result").html(textStatus);
                        }
  });

現在、ajax呼び出しでタイムアウトを3000に増やし、すぐに何らかの理由でタイムアウトエラーを返します。呼び出しからタイムアウトプロパティを削除すると、呼び出しが実行され、スクリプトが実行されます..しかし、ジョブの70%しか完了していません..done は空のエラーを返しました...

更新:スクリプトの実行時間を改善するためにすべてを実行しました:コンソールは404を返しません..

4

3 に答える 3

5

サムネイルの作成をループで実行し、ループごとにサーバー メモリから前のリソースを削除します。

imagedestroy($thumb);
imagedestroy($source);

これは非常に役立ちます。非常によく似たものを完成させました。

于 2013-05-07T09:03:22.717 に答える
0

問題が見つかりました..サーバーのアイドル状態(Apache)が2分に設定されていました..スクリプトは170枚の画像のディレクトリをループし、3分間親指を作成します..サーバーが応答を返さないため、接続が切断されました.解決策は、oboutを削減したJames Okpe Georgeの提案でした.画像ごとに0.5秒、次に私の場合はすべての画像が同じサイズだったので、ディレクトリ内の最初の画像のみに基づいて親指を作成しました..画像ごとに半分の秒を減らしました.その後、プロセス全体を2つに分割しました[ディレクトリのリストを取得] =>配列それ..応答を返す..親指を立てるための2番目の呼び出し.. 170で1.2分...悪くない。

于 2013-05-08T12:29:53.990 に答える