如何使用php cron

时间:2016-06-20 17:51:39

标签: php image ftp cron imagemagick

我为摄影师创建了一个小应用程序,可以在音乐活动期间拍摄实时照片。

  1. 图像从尼康相机发送到我的ftp服务器。

  2. 应用程序检查(cron)指定文件夹中是否有新图像

  3. 然后将它们复制到" develop"文件夹,使用ImageMagick处理它们(调整大小,过滤和水印)

  4. 然后将它们移到"发送"文件夹并将其附加到发送给指定收件人的电子邮件中。

  5. 问题:我希望能够在处理之前检查图像是否已完全上传。 cron每隔5分钟运行一次,摄影师在音乐会期间连续拍摄。

    我一直在这里查看类似的问题,但我并没有真正找到解决方案。所以,如果是一个重复的问题,我为此道歉。

    谢谢,s @ ch @ x

    更新#1 - 这是我对Mark Setchell的建议所做的测试:

    `exec("convert -regard-warnings -size 1280x44.879451 xc:none -gravity center -pointsize 24 -font 'Times-Bold' -stroke black -strokewidth 1 -annotate 0 '©M.Setchell' -background none -shadow 100x3+0+0 +repage -stroke none -fill white -annotate 0 '©M.Setchell' roll/SUBSONICA.JPG +swap -gravity south -geometry +0-3 -composite send/SUBSONICA.JPG && rm roll/SUBSONICA.JPG");`
    

    `exec("convert -size 1280x44.879451 xc:none -gravity center -pointsize 24 -font 'Times-Bold' -stroke black -strokewidth 1 -annotate 0 '©M.Setchell' -background none -shadow 100x3+0+0 +repage -stroke none -fill white -annotate 0 '©M.Setchell' roll/SUBSONICA.JPG -regard-warnings +swap -gravity south -geometry +0-3 -composite send/SUBSONICA.JPG && rm roll/SUBSONICA.JPG");`
    

    以下vars来自php:
    -size 1280x44.879451$imageSize = getimagesize($developDir . $developFile);
    -annotate 0 '©M.Setchell'$watermark
    roll/SUBSONICA.JPG$developDir . $developFile语句中的输入文件:foreach
    send/SUBSONICA.JPG$sendDir . $developFile语句中的输出文件:foreach

    通过测试,在通过ftp手动上传图片的过程中,我收到了预期有8个附件的电子邮件,其中4个仍然是部分图像。

    UPDATE#2 - 我在exec函数中添加了一个输出数组和一个var用于执行命令的返回状态 - 就像在@Mark Setchell中一样更新如下。

    然后,通过简单的if ... else语句,我可以轻松地分析结果:

    • if(返回状态== 1 )图片文件不是有效且已完成的图片文件,因此我们从已处理的文件夹中删除图片("发送"文件夹我的应用)
    • 其他(返回状态== 0 )文件是有效的&一个完整的图像文件:我们从ftp文件夹中删除文件,摄影师直接从尼康相机(我的应用程序中的" roll"文件夹)发送图像。

    因此,根据@Mark Setchell的回答,正确且完整的exec字符串是:

    `convert -regard-warnings -size 1024x40 xc:none -gravity center -pointsize 20 -font 'Times-Bold' -stroke black -strokewidth 1 -annotate 0 '©2016 Mark Setchell' -background none -shadow 100x3+0+0 +repage -stroke none -fill white -annotate 0 '©2016 Mark Setchell' roll/SUBSONICA_small.jpg +swap -gravity south -geometry +0-3 -composite send/SUBSONICA_small.jpg`
    

    以下是完美运作的代码段:

    exec("convert $im_cmd", $convert_output, $returned_var);
        if ($returned_var) {
            unlink($send_dir . "/" . $developFile);
    
        } else {
            unlink($develop_dir . "/" . $developFile);
        }
    

    这个解决方案非常有效,经过10次测试证明它非常可靠:不是通过php检查文件,而是最初的问题,@ Mark Setchell的方法 - 使用-regard-warnings选项Imagemagick转换程序link - 解决了问题。

1 个答案:

答案 0 :(得分:0)

更新了答案

好的,我们现在很近!如果要使用PHP而不是命令行,则需要从exec()获取返回值,并根据该值执行某些操作。因此,如果您选中here,则可以看到如何获取返回值:

exec("convert -regard-warnings inputfile ... resize ... filter ... output/outputfile",array &$output, int &$return_var);

然后,如果$return_var为零,则需要删除输入文件,因为该命令有效,如果它不为零,则需要删除输出文件,因为它没有。

原始答案

您可以让ImageMagick告诉您文件是否不完整。因此,不是盲目地复制文件,而是从FTP目录中" en masse" ,而是使用Imagemagick convert从那里处理它们到处理过的目录,只删除成功处理的那些,在下一个cron调用的基础上保留其他任何未完成的处理。所以,像这样:

cd FTPDirectory
for f in *.jpg; do
    convert -regard-warnings ... resize ... sharpen ... "%f" processed/"%f"
    # If successful, delete source file
    if [ $? -eq 0 ]; then
        rm "%f"
    fi
done

-regard-warnings标志会将警告视为错误。因此,如果我不使用它,处理不完整的文件时我没有错误状态:

convert incomplete.jpg  processed.jpg
convert: Premature end of JPEG file `incomplete.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.
convert: Corrupt JPEG data: premature end of data segment `incomplete.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.

echo $?
0

然而,如果我使用它,我会收到一个可捕获的错误:

convert -regard-warnings incomplete.jpg  processed.jpg
convert: Premature end of JPEG file `incomplete.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.
convert: Corrupt JPEG data: premature end of data segment `incomplete.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.

echo $?
1