我使用此命令成功运行了一个cron作业:
cd "public_html/wp-content/uploads/bpfb/" && mogrify -strip -resize 800x800\> *.jpeg *.jpg
这基本上会拍摄所有JPEG图像,并通过ImageMagick将它们调整到特定文件夹中。但是,问题是该命令将根据cron间隔反复处理“已处理”的图像。我需要将所有文件保存在同一个目录中,所以我正在寻找一种方法,即cron(或PHP脚本)可以检测它是否已被处理并在下一个cron周期中排除这些文件。
(请注意我对cron或PHP脚本不太了解,因此非常感谢我的基本步骤)。
答案 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,你可以顺便把它写到另一个目录。