【发布时间】:2015-11-26 22:27:25
【问题描述】:
我正在编写一个包含用户上传视频的网站后端。为了确保最大的可访问性,我正在压缩上传的视频并将它们重新保存为 .mp4 和 .webm 格式以覆盖所有浏览器(或尽可能多的浏览器)。为此,我在 PHP exec() 函数中运行 avconv 命令。
我不想让用户在页面加载之前等待脚本完成,所以我异步运行代码。到目前为止,我的代码如下。
exec('bash -c "exec nohup setsid avconv -i ' . $tempPath . ' -c:v libx264 ' . $transpose . ' ' . $newPath . 'mp4 > /dev/null 2>/dev/null &"');
exec('bash -c "exec nohup setsid avconv -i ' . $tempPath . ' -c:v libvpx ' . $transpose . ' ' . $newPath . 'webm > /dev/null 2>/dev/null &"');
除了运行 exec 函数之外,我还将视频保存到数据库并向用户发送一封电子邮件,感谢他们上传视频。
问题来了:我希望服务器等待视频转换完成,然后将其添加到数据库并向用户发送电子邮件。基本上,程序流程是:
用户上传视频。 视频放置在临时文件夹中。 用户被带到一个感谢页面,表明他们的视频很快就会上线。 服务器执行两个 avconv 命令来转换和压缩视频以供 Web 使用。 两次转换完成后,视频信息将添加到 MySQL 数据库,向用户发送一封电子邮件,并删除原始上传的视频。
这可能只是我对命令行的无知(事实上它几乎肯定是),但我怎么能“排队”这些命令呢?首先进行两种转换,然后调用 PHP 脚本添加到数据库,然后删除原始视频,同时与原始 PHP 脚本异步?
编辑:我尝试使用“&&”运算符将它们排队,如下所示:
exec('bash -c "exec nohup setsid avconv -i ' . $tempPath . ' -c:v libx264 ' . $transpose . ' ' . $newPath . 'mp4 && avconv -i ' . $tempPath . ' -c:v libvpx ' . $transpose . ' ' . $newPath . 'webm > /dev/null 2>/dev/null &"');
但是,这似乎抵消了我正在异步运行它的事实,因为页面现在似乎在等待命令完成。
【问题讨论】:
标签: php video asynchronous ffmpeg avconv