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

最善の解決策は、名前を変更するか、別のディレクトリに移動することです。

あなたがそれを行うことができないと言うように、イメージの幅と高さ = 800 の場合、getimagesize()または同様のものを使用してイメージの寸法を取得する PHP スクリプトを作成できます。

ただし、これは最も効率的なソリューションではありません。

テストされていない例:

<?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  
        }
    }

  }

?>

You may want to get the actual mime type of the image rather than an extension match if you can't trust the images source.

于 2013-10-04T18:43:36.197 に答える
1

2 番目の方法は、処理されたファイル名をログ ファイルに記録し、ディレクトリ リストと比較して処理されたかどうかを確認することです。

再びテストされていません:

<?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 に答える