代码之家  ›  专栏  ›  技术社区  ›  Mitya

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

  •  0
  • Mitya  · 技术社区  · 6 年前

    shell_exec() .

    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 ). 我所能做的就是通过

    shell_exec('ffmpeg -i file.webm -c:v libx264 -c:a aac -strict -2 file.mp4 > MYFILE.txt 2>/dev/null &');
    

    …但很明显,它只是创建并写入一个文件,而不是通过PHP调用和执行它。

    1 回复  |  直到 6 年前
        1
  •  1
  •   ArtisticPhoenix    6 年前

    & 关闭命令的末尾,并使其阻塞,以便PHP可以告诉您任务已经完成。但在这样做之前,您不能返回到最终用户。

    方案1 所以解决这个问题的一种方法是生成一种引导PHP脚本,您称之为非阻塞。在这个脚本中,执行now blocking转换命令,然后让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

    因为转换是输出一个文件,所以可以启动一个单独的后台作业,监视输出文件的修改时间。如果修改后的时间像过去的一分钟,那么可以假设已经完成了对DB的转换和更新。只要数据被添加到文件中,修改的时间就应该继续更新。

    希望有帮助。

    另外,我有一些代码,你可能会很有用的GitHub

    https://github.com/ArtisticPhoenix/MISC/blob/master/BgProcess.php

    PHP进程锁定(使用文件进行互斥模拟)

    https://github.com/ArtisticPhoenix/MISC/blob/master/ProcLock.php

    PHP程序的命令行参数映射:

    https://github.com/ArtisticPhoenix/Cli

    如果对你有帮助的话,欢迎你使用它们。