0

我成功地使用以下命令运行了一个 cron 作业:

cd "public_html/wp-content/uploads/bpfb/" && mogrify -strip -resize 800x800\> *.jpeg *.jpg

这基本上采用所有 JPEG 图像并通过 ImageMagick 在特定文件夹中调整它们的大小。但是,问题在于此命令将根据 cron 时间间隔一遍又一遍地处理“已处理”的图像。我需要将所有文件保存在同一个目录中,所以我正在寻找一种方法,让 cron(或 PHP 脚本)可以检测它是否已经被处理并在下一个 cron 周期中排除这些文件。

(请注意,我对 cron 或 PHP 脚本不太了解,因此非常感谢我的基本步骤)。

4

3 回答 3

2

最好的解决方案是重命名或移动到另一个目录。

正如您所说的那样,您不能这样做,那么您可以创建一个使用getimagesize()或类似方法来获取图像尺寸的 PHP 脚本,如果图像宽度和高度 = 800,那么您可以假设它已被处理。

虽然这不是最有效的解决方案。

未经测试的例子:

<?php

  $imageDirectory = "/home/public_html/images/"; // Path to your images 

  // Read all files in directory. (You could put this in a function and call recursively if you have child directories.)
  $files = scandir($imageDirectory);

  foreach($files as $file)
  {
    if($file == '.' || $file == '..') 
    {
       continue;
    }

    if(preg_match('/\.(jpg|jpeg)$/', $file))
    {
        list($width, $height, $type, $attr) = getimagesize($imageDirectory . $file);

        // This is your image resize condition, change to suit your requirements
        if($width > 800 && $height > 800)
        {
           // Resize Image Code Here  
        }
    }

  }

?>

如果您不能信任图像源,您可能希望获取图像的实际 mime 类型而不是扩展匹配。

于 2013-10-04T18:43:36.197 回答
1

第二种方法是将已处理的文件名记录到日志文件中,并与目录列表进行比较以查看它是否已被处理。

再次未经测试:

<?php

   // Open log file so we can read and put processed image name onto array
   $imageLogFilename = 'image.log';
   $fh = fopen($imageLogFilename,'a+');

   $processedFileNames = array();
   $newProcessedFileNames = array();

   // Read file line by line and add filename onto an array
   if($fh)
   {
     while (($line = fgets($fh)) !== false) 
     {
       $processedFileNames[] = trim($line);
     }

     fclose($fh);   

   }
   else
   {
      die('error - could not open log for reading');
   }




   $imageDirectory = "/home/public_html/images/"; // Path to your images 

   // Read all files in image directory. (You could put this in a function and call recursively if you have child directories.)
   $files = scandir($imageDirectory);

   foreach($files as $file)
   {
     if($file == '.' || $file == '..') 
     {
       continue;
     }

     // check if this image is in the already processed image array
     if(in_array($file, $processedFileNames) === false)
     {
        // your resize code here

        if($resizeResult == false)
        {
          die('Image Resizing Failed');
        }             

     }

     // Store all images on new array
     $newProcessedFileNames[] = $file;  

   }


   if(count($newProcessedFileNames) > 0)
   {

     // open logfile again but this time truncate and update with latest image filenames, so its up to date for next run.
     $fh = fopen($imageLogFilename,'w');

     if($fh)
     {
        foreach($newProcessedFileNames as $filename)
        {
          fwrite($fh,$filename . PHP_EOL);
        }

        fclose($fh);
     }
     else
     {
       die('error - could not write to log file');
     }
   }

   fclose($fh);       

?>
于 2013-10-04T21:36:46.920 回答
0

我建议使用 cron 以您选择的语言调用脚本。

然后您可以在其中添加逻辑以防止它再次处理图像。您可以将完成的文件放在不同的文件夹中,用前缀或后缀进行不同的标记,或者您可以在某处保留日志。

mogrify 有一个参数 -path ,你可以顺便把它写入另一个目录。

于 2013-10-04T18:38:10.750 回答