FFMPEG后台任务完成后运行脚本(通过PHP)

时间:2018-11-09 19:04:14

标签: php video ffmpeg background

我有一个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调用和执行。

1 个答案:

答案 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

如果可以帮助您,欢迎您使用它们。