是否可以仅对未处理的文件运行cron作业?

时间:2013-10-04 18:26:28

标签: php cron imagemagick

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

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

这基本上会拍摄所有JPEG图像,并通过ImageMagick将它们调整到特定文件夹中。但是,问题是该命令将根据cron间隔反复处理“已处理”的图像。我需要将所有文件保存在同一个目录中,所以我正在寻找一种方法,即cron(或PHP脚本)可以检测它是否已被处理并在下一个cron周期中排除这些文件。

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

3 个答案:

答案 0 :(得分: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类型而不是扩展匹配。

答案 1 :(得分: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);       

?>

答案 2 :(得分:0)

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

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

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