实时获取多个exec()进程的进度

时间:2011-06-25 23:46:24

标签: php linux

我有一个执行ffmpeg的php脚本然后它开始工作。我可以执行此脚本4次并生成4个进程。我想实时取得进展。如何获取并确定每个输出的哪个进程?

$h = fopen('php://stdin', 'r'); $str = fgets($h);

我知道该行将获得stdin中的任何输出,但是如何将它分开?如何连续轮询输出?进程启动后,如何连续访问该输出?我知道你需要ajax但是php方法允许你访问该信息并将其与其他进程分开。 有些人建议将输出定向到文本文件并获取内容,但这是唯一的方法吗?为什么要为每个进程制作更多文本文件?另一个建议在命令后使用2>&1 | php script.php重定向输出。这只会在文件执行一次后的过程开始时输出。

我一直在努力解决这个问题并且越来越近了,所以任何专业人士的帮助都会非常感激。

请参阅修改

$process = exec("/usr/local/bin/ffmpeg -i /home/g/Desktop/cave.wmv -deinterlace -acodec libfaac -ab 96k -ar 44100 -vcodec libx264 -s 480x320 -f flv /home/g/Desktop/file.flv")

3 个答案:

答案 0 :(得分:0)

这有点复杂。据我所知,exec阻塞PHP线程直到它完成。我认为 ffmpeg可以将它的进度写入文件。您需要解析该文件以获得进度。你想用Ajax调用它。

你需要弄清楚如何让ffmpeg报告它的进展,其余的很容易:P

答案 1 :(得分:0)

如果一次只运行4个进程,我真的认为没有理由不创建4个文本文件并将ffmpeg的输出指向那些文件。之后,这只是用PHP读取这些文本文件的问题。

如果您打算使此HTTP可操作,您可以创建两个脚本:start_process.php和process_status.php。第一个文件将ID作为输入,启动ffmpeg进程,不断读取其进度并向MySQL数据库报告。 process_status.php将使用与输入相同的ID,并将状态从MySQL报告给用户。您可以将该文件挂钩到Ajax并获取实时更新。

您必须通过检查相同ID的双重输入来完善解决方案,可能会自动创建ID并从start_process.php等返回。

答案 2 :(得分:0)

您应该为这四个进程创建一个数组。使用proc_open启动进程并将返回的资源打包到数组中。然后,您可以轮询您的数组,查看每个流程资源的输出。

http://us2.php.net/manual/en/function.proc-open.php

相关问题