【问题标题】:Scan Directory and Create Thumbnail Images扫描目录并创建缩略图
【发布时间】:2013-05-29 01:22:02
【问题描述】:

我正在创建脚本来扫描图像目录,然后将缩略图创建到另一个目录。

function createThumbs( $pathToImages, $pathToThumbs, $thumbWidth ) 
{
// Turn off all error reporting
error_reporting(0);

set_time_limit(0);
  // open the directory
  $dir = opendir( $pathToImages );

  // loop through it, looking for any/all JPG files:
  $i='1';
  while (false !== ($fname = readdir( $dir ))) {
    // parse path for the extension
    $info = pathinfo($pathToImages . $fname);
    // continue only if this is a JPEG image
        $source_file_name = basename($source_image);
        $source_image_type = substr($source_file_name, -3, 3);

        switch(strtolower($info['extension']))
        {
        case 'jpg':
            $img = imagecreatefromjpeg("{$pathToImages}{$fname}");
            break;

        case 'gif':
            $img = imagecreatefromgif("{$pathToImages}{$fname}");
            break;

        case 'png':
            $img = imagecreatefrompng("{$pathToImages}{$fname}");
            break;    
        }

      echo "$i : Creating thumbnail for small_$fname <br />";

      // load image and get image size
      $width = imagesx( $img );
      $height = imagesy( $img );

    // this will be our cropped image

    // copy the crop area from the source image to the blank image created above

    // calculate thumbnail size
      $new_width = $thumbWidth;
      $new_height = $thumbWidth;

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


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


    switch(strtolower($info['extension']))
    {
        case 'jpg':
            imagejpeg($tmp_img, "{$pathToThumbs}small_$fname", 100);
            break;

        case 'gif':
            imagegif($tmp_img, "{$pathToThumbs}small_$fname");
            break;

        case 'png':
            imagepng($tmp_img,"{$pathToThumbs}small_$fname", 0);
            break;    
    }
    imagedestroy($img);
    imagedestroy($tmp_img);
    $i++;
      }
  // close the directory
  closedir( $dir );
}

我们用

来调用这些函数
createThumbs("media/normal/","media/small/",70);

脚本运行良好,但问题是,我有大约 4000 张图片,脚本停止在大约 2400-2600 张图片上创建缩略图

你可以试试这个链接http://saharandev.co.uk/saharan/create_thumbs_small.php

有人可以帮忙吗?

谢谢

【问题讨论】:

  • “停止创作”是什么意思?脚本是否停止执行?不遍历那些图像?执行得很好,但根本不对这些图像做任何事情?抛出异常?抛出错误?一个警告?在哪一行?
  • 查看日志:脚本是否因超时、OOM 或其他原因停止?
  • @Patashu:我运行了脚本,它在2335 : Creating thumbnail for small_S60.10700.jpg 停止,我建议删除error_reporting(0); 以显示错误。
  • 我第二次注释掉error_report(0),而你在调试时至少它不应该在那里。另一点是 set_time_limit() 仅在 safe_mode (PHP
  • 对所有人来说,我在我的本地主机上尝试了代码,它可以很好地在 7000 个图像上创建缩略图,但是当它在线时它将停止在 2000 个图像上,我在我的主机上找不到任何日志

标签: php opendir


【解决方案1】:

不久前我遇到了类似的问题。我猜您的托管服务器 php.ini 中的 PHP 脚本执行时间指令设置为低于完成处理任务所需的时间值

为了防止脚本超时,需要增加处理脚本的执行时间。您可以在脚本或函数中执行此操作。这是一个例子:

function createThumbs( $pathToImages, $pathToThumbs, $thumbWidth ) 
{
  ini_set('max_execution_time', 300); //300 seconds = 5 minutes
  ... Your code here ...
}

如果您仍然遇到错误,请尝试将max_execution_time 增加到更高的值。

检查您的源目录中是否有除.jpeg.gif.png 以外的文件并将其删除。可能是 .bmpThumbs.db 文件导致错误。我提到了Thumbs.db,因为 Windows 通常会在包含视频或图片的文件夹中生成此文件。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我知道这是一个老话题,但我想我会在此添加我的经验。 如果您通过浏览器执行脚本,超时将是一个问题。在我思考的过程中,我想出了最简单的解决方案,而无需更改服务器设置,那就是使用 AJAX。

    因此,通过使用 jQuery AJAX,您可以让 jQuery 触发 PHP 脚本一次处理一张照片,然后报告状态。您可以让 javascript 更新“列表”或其他内容,这样您就可以在所有照片的过程中看到它的位置。所以它会是这样的:jQuery发送命令来处理下一个文件> PHP处理文件,然后报告> jQuery处理响应,然后重复这个过程。

    这样做的最大缺点是浏览器必须保持打开状态,直到所有文件都完成。您可以通过命令提示符运行脚本轻松克服限制,但根据我的经验,这有点复杂。

    无论如何,我希望能帮助其他人解决如何迭代许多照片并克服限制,尤其是当您无法访问或更改服务器设置时。

    【讨论】: