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% 的工作..完成返回空错误...

更新: ..我现在执行一切以使脚本执行时间更好:控制台返回 404 Not Found..

4

3 回答 3

5

使缩略图的创建循环运行,并在每个循环之后从服务器内存中删除先前的资源。

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

这将有很大帮助,我刚刚完成了一些非常相似的事情。

于 2013-05-07T09:03:22.717 回答
0

发现问题..服务器空闲(apache)设置为 2 分钟 ..脚本循环 170 个图像的目录并创建 3 分钟的拇指 ..因为服务器不会返回答案连接被丢弃。解决方案是 James Okpe George 的建议,它减少了 obout每张图片半秒,接下来在我的情况下,所有图片的大小都相同,因此仅根据目录中的第一张图片制作拇指。每张图片减少半秒。之后我将整个过程分成 2 [获取目录列表] =>排列它..返回响应..第二次打电话给大拇指.. 170 分钟 1.2 分钟...不错。

于 2013-05-08T12:29:53.990 回答
0

从编码的角度来看,您几乎无法对脚本进行加速,毕竟处理 100 多张图像并不是一项简单的任务。

但是,您可以很容易地设置脚本超时,以防止发生“超时”错误。您可以在 php.ini 中设置它,也可以在 PHP 脚本本身中设置它,如下所示:

// Set the seconds (2 minutes)
$seconds = 120;

// Set the maximum execution time
set_time_limit($seconds);

有关的更多信息,请参见此处set_time_limit()


虽然上述方法可以解决您的问题,但您最好通过 Windows 任务计划程序或 Cron(取决于您的操作系统)运行此脚本。使用此方法,您可以在特定时间间隔执行脚本。

如果您正在执行的“图像处理”不是基于事件的,则上述计划解决方案将是一个合适的解决方案。我的意思是当您的用户执行某些特定操作(例如单击按钮)时,不需要处理图像......

于 2013-05-07T09:01:45.453 回答