我有一个 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 脚本(更新数据库标志)?
我已经做了很多谷歌搜索,但我对服务器命令的了解还不足以理解我正在阅读的内容(例如 this answer )。我能做到的最好的是将标准输出重定向到一个文件
shell_exec('ffmpeg -i file.webm -c:v libx264 -c:a aac -strict -2 file.mp4 > MYFILE.txt 2>/dev/null &');
...但显然这只是创建和写入文件,它不会通过 PHP 调用和执行它。
最佳答案
我对服务器命令也不是很擅长,所以我无法真正帮助你。但我确实有解决问题的诀窍。
所以我看到了一些你可以做到这一点的方法,基本上你需要 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
然后从您的 Controller 或您所说的 Bootstrap 非阻塞
shell_exec('php {pathto}/bootstrap.php 2>/dev/null &');
这样,对 Bootstrap 的调用立即返回,但转换调用被阻塞,这使您有机会更新数据库后记。
选项 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
如果对您有帮助,欢迎您使用它们。
关于php - FFMPEG 后台任务完成后运行脚本(通过 PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53231861/