我有一个PHP脚本,可通过shell_exec()
触发FFMPEG文件转换。
shell_exec('ffmpeg -i file.webm -c:v libx264 -c:a aac -strict -2 file.mp4 >/dev/null 2>/dev/null &');
这是在后台发生的(因此&
),即脚本在转换完成之前就完成了。
转换完成后,是否可以调用并执行PHP脚本(以更新DB标志)?
我已经做了大量的Google搜索工作,但是我对服务器命令的了解还不足以理解我正在阅读的内容(例如this answer)。我能管理的最好的方法是将stdout通过以下方式重定向到文件:
shell_exec('ffmpeg -i file.webm -c:v libx264 -c:a aac -strict -2 file.mp4 > MYFILE.txt 2>/dev/null &');
...但是很明显,它只是创建并写入文件,它不会通过PHP调用和执行。
答案 0 :(得分:1)
我在服务器命令方面也不是很擅长,所以我真的无法帮助您。但是我确实有解决问题的诀窍。
因此,我看到了一些可以执行此操作的方法,从本质上讲,您需要PHP在命令行调用完成后执行某些操作。显而易见的答案是从命令末尾删除&
并使其阻塞,以便PHP坚持执行以告知工作已完成。但是这样做之后,您才能返回最终用户。
选项1 因此,解决此问题的一种方法是制作一种您称为非阻塞的Bootstrap PHP脚本。在此脚本中,执行您现在阻止的转换命令,然后在返回后使PHP执行其他操作。
//bootstrap.php
shell_exec('ffmpeg -i file.webm -c:v libx264 -c:a aac -strict -2 file.mp4 > MYFILE.txt 2>/dev/null'); //blocking
//Update the DB
然后从您的控制器或您所说的引导非阻塞引导
shell_exec('php {pathto}/bootstrap.php 2>/dev/null &');
这样,对引导程序的调用会立即返回,但转换调用被阻止,这使您有机会更新数据库后缀。
选项2
由于转换正在输出文件,因此您可以启动一个单独的后台作业,该后台作业监视输出文件的修改时间。然后,如果修改后的时间就像过去的一分钟,则可以假定它已完成转换和更新数据库的操作。只要将数据添加到文件中,修改后的时间就应继续更新。
希望有帮助。
PS。我有一些代码可能对GitHub有用
在Windows和Linux中都运行后台进程
https://github.com/ArtisticPhoenix/MISC/blob/master/BgProcess.php
PHP进程锁定(使用文件进行Mutex模拟)
https://github.com/ArtisticPhoenix/MISC/blob/master/ProcLock.php
PHP程序的命令行参数映射:
https://github.com/ArtisticPhoenix/Cli
如果可以帮助您,欢迎您使用它们。