【问题标题】:shell_exec echo'ing too fast or too lateshell_exec 回显太快或太晚
【发布时间】:2017-01-22 21:05:10
【问题描述】:

所以我阅读了这篇文章:https://trac.ffmpeg.org/wiki/PHP 发现了这个:

<?php
echo "Starting ffmpeg...\n\n";
echo shell_exec("ffmpeg -i input.avi output.avi >/dev/null 2>/dev/null &");
echo "Done.\n";

代码几乎可以正常工作,但唯一困扰我的是,因为 shell_exec 是在后台执行的(所以标签上始终没有加载标志)所有的 echo 都会立即执行.这意味着,在 ffmpeg 完成其任务之前正在写入“完成”回声。

但是当我删除 '&' 时,该站点也会执行它打算执行的操作,但现在它会等到 shell_exec 完成,直到它回显“正在启动 ffmpeg...”

所以我有点想知道如何获得这样的订单:

1) 回显某些东西 2)执行 commad 并等待它完成。 3) 再次回显

我是 php 的初学者,但总体上具有编程经验。请发慈悲。

感谢您的宝贵时间!

【问题讨论】:

  • 在命令末尾使用 & 将立即返回(并在后台运行该进程)这就是页面加载并在命令输出完成之前显示最终 echo 语句的原因。这个答案提供了一种无需等待完成即可启动任务的方法,并且还可以查询转换的进度stackoverflow.com/a/6245461/2543650

标签: php ffmpeg shell-exec


【解决方案1】:

您可能希望在执行 shell_exec 之前使用 flush。使用它有一些注意事项,这些在 php 文档页面中有很好的解释。希望这会有所帮助。

<?php
  echo "Starting ffmpeg...\n\n";

  ob_flush();
  flush();
  echo shell_exec("ffmpeg -i input.avi output.avi >/dev/null 2>/dev/null");

  // a sleep could effectively be the same as your shell_exec operation
  // sleep(5);

  echo "Done.\n";
  ob_end_flush();

【讨论】:

  • 我使用了flush();我的 shell_exec 之前的函数。它没有帮助,但感谢您的输入!
  • 你在flush之后是否也尝试过ob_flush()?
  • 对不起 - 我只是忽略了你的代码,只是看到了 flush();但没有看到其他 ob_flushes!它真的奏效了!不幸的是,尽管我的 html 代码因此而消失了。我目前在 vm 中使用我的本地服务器,只是一些带有 1 个按钮和 2 或 3 个单词的基本 html,但它们现在似乎消失了! “开始的ffmpeg”现在站在那里。对 html 部分还有什么建议吗?
  • 编辑:好像 html 的东西在我的 exec 完成后又出现了!奇怪....还是没有?编辑 2.0:它只删除了脚本下面的部分而不是上面的 html 部分,也许这有帮助
猜你喜欢
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多