wget作为后台任务,随后是连续的后台任务

问题描述

我正在尝试从PHP执行此操作-基本上是从远程位置下载jpg,并在必要时调整其大小。第二个任务不是那么重要,但是我想要的是让第二个任务等待wget成功完成,但是对于它们两者都是按顺序在后台运行,并且不会像任务那样占用PHP线程对于PHP而言,它并不是立即重要的,而是出于缓存目的:

shell_exec('(wget -q -O /tmp/pic1.jpg https://r.ddmcdn.com/s_f/o_1/APL/uploads/2014/10/nyan-cat-01-625x450.jpg&& convert /tmp/pic1.jpg -quality 80 -interlace Plane -resize 180x\> /tmp/pic1_reduced.jpg) &');

但是上面发生的事情是PHP挂起,直到两个任务都完成(为什么给定&后缀?)

如果我使用wget -b开关(虽然如果我已经在使用&?,为什么需要这样做),它确实作为后台任务运行,但是第二个任务(convert)失败,因为wget任务现在位于另一个线程上,它尝试转换尚未(完全)下载的文件。

哦,如果我愿意的话:

(wget -q -O /tmp/pic1.jpg https://r.ddmcdn.com/s_f/o_1/APL/uploads/2014/10/nyan-cat-01-625x450.jpg&& convert /tmp/pic1.jpg -quality 80 -interlace Plane -resize 180x\> /tmp/pic1_reduced.jpg) &

直接在外壳中,它不会绑住终端,而是按照我想要的方式运行-作为两个连续的后台任务。

那么如何从PHP触发此任务序列,使其在shell中作为后台任务顺序运行?

编辑:哦,作为讨厌的黑客,我试图像这样添加sleep 10&&

shell_exec('(wget -bq -O /tmp/pic1.jpg https://r.ddmcdn.com/s_f/o_1/APL/uploads/2014/10/nyan-cat-01-625x450.jpg&& sleep 10&& convert /tmp/pic1.jpg -quality 80 -interlace Plane -resize 180x\> /tmp/pic1_reduced.jpg) &');

...发现如果没有在10秒钟之内完成,它基本上还是会失败,我以后会知道它失败了,因为文件不存在。

但是,即使sleep 10&在后​​台运行,即使for(i=0; i<1000000000; i++){}确实在后台运行,也可以将PHP挂起10秒钟。我想我这里缺少有关后台任务如何工作的信息。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)