我想将上传的 PDF 文件转换为 JPG 图像,并在转换过程完成后压缩这些图像。我使用ImageMagick
库的convert
命令进行 PDF 到 JPG 的转换。
为了实现这一点,我使用&&
如下操作数:
convert /tmp/asdassa_1395994117.pdf -density 200 /tmp/files/asdassa_1395994117.pdf.jpg && zip -r /tmp/files/files.zip /tmp/files/* &
除了一件事之外,这个命令工作正常:它在前台运行,因此服务器在它完成之前不会响应。
如果我使用其中任何一个命令,并&
在命令末尾添加,它会在后台运行,我可以尽快得到响应。但是当一起使用时,情况并非如此。
我是不是漏掉了什么?可能是关于命令类型?因为使用和这样的简单命令测试和操作数&&
在后台运行,正如我所期望的那样,例如这个命令:&
sleep
mkdir
sleep 10 && mkdir bla &
10秒后进入后台并创建bla目录。
PS 我的服务器在 Amazon Linux AMI 2013.03 上运行
编辑:事实证明,问题不在于操作系统,而在于exec()
PHP 的功能。请查看我的答案,看看我是如何解决这个问题的。
答案1
所以事实证明,问题不在于我如何使用命令,而在于我如何使用 PHP 命令。
我这样做是这样的:
exec($command);
但是,我后来发现该exec()
命令并不喜欢这种用法。因此,我决定将命令放入临时.sh
文件并使用它,而不是直接传递该命令exec()
。
// create the command, don't forget to delete the temporary file with a last command
$command = "convert /tmp/asdassa_1395994117.pdf -density 200 /tmp/files/asdassa_1395994117.pdf.jpg && zip -r /tmp/files/files.zip /tmp/files/* && rm /tmp/temp.sh";
// create file with this command
exec("echo '".$command."' > /tmp/temp.sh");
// execute on the background with output
exec("sh /tmp/temp.sh > /dev/null 2>&1 & echo $!");
效果很好。