我正在查看名为FFMpeg的库,我相信它在symfony2中使用。在示例中有一个方法如下所示:
$format->on('progress', function ($video, $format, $percentage) {
echo "$percentage % transcoded";
});
反过来,它会显示浏览器的实时进度。我正在寻找一个非常简单的例子,它的工作原理和任何能够非常清楚地解释它的博客一样。我渴望学习。
答案 0 :(得分:1)
我对该库不熟悉,但从您发布的代码判断,第二个函数是php
中的回调而不是javascript
,此时没有任何内容呈现给浏览器。完成函数执行完毕后,最后得到的就是echo部分。
让我稍微概括一下,因为我已经看到相同数量的问题
基本上如果在php
中有一个长时间运行的函数,你永远不会在views
内调用它,或者这也可以说是你从未直接从javascript XHR调用它,因为这会阻止该请求。正确的方法涉及队列和 websockets (或旧浏览器的XHR轮询)
来自您的代码库
$format->on('progress', function ($video, $format, $percentage) {
echo "$percentage % transcoded";
});
不是调用将输出输出到output stream
的echo函数,而是将其推入带有channel
的redis队列。将channel
视为简单的聊天室。
建立到服务器端点的websocket连接,该端点POPS队列中的值并将其发送到客户端。此端点可能也可能不是用PHP编写的,因为它不是您正在编写的API的一部分,而是更多WebSocket
连接处理程序。
现在您可能已经意识到您确实需要以某种方式启动该功能。为此,您可以使用celery
之类的库,或者如果您想批量处理,也可以转到CRON
。
实现将是一个简单的PHP view
,它将作业添加到芹菜中,并在作业成功添加到进程时返回请求的状态。
为了更清楚,我正在添加一个简单的图表来帮助完成这个过程