【问题标题】:Progress bar for a bash script running from php从 php 运行的 bash 脚本的进度条
【发布时间】:2015-02-18 11:56:03
【问题描述】:

在 StackOverflow 上人们的无价帮助下,我设法从 php.ini 运行了一个 bash 脚本。现在一切都运行良好,但由于脚本需要几分钟才能结束,我希望看到进展。在 bash 脚本中有一些 printf 命令输出错误/成功消息。

作为 php 的新手,我认为这些消息会在 bash 脚本中执行时出现。但是尽管脚本完成了,但我没有得到任何输出。我可以看到创建的文件并确定脚本已完成,但在浏览器中看不到任何 php 输出。

如何在脚本仍在运行时检查进度?为什么php似乎没有结束?

以下是 php 脚本。

<?php

echo "<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
      <html xmlns=http://www.w3.org/1999/xhtml>
      <head>
      <meta http-equiv=Content-Type content=text/html; charset=UTF-8 />
      <title>Title</title>
      <link href=../style.css rel=stylesheet type=text/css>
      </head>
      <body topmargin=0 leftmargin=0>";
echo '<font color=blue>';

echo '------------------------------------------------------------- <br>';
echo 'Inicio de la generación manual de mapas de olas de calor<br>';
echo 'Este proceso tarda varios minutos<br>';
echo '-------------------------------------------------------------<br>';
echo date('h:i:s') . "\n";
$output = shell_exec('/home/meteo/www/RAMS/olas/generar-mapas.bash');
echo "<pre>".$output."</pre>";
echo '</font>';
echo '</body>';
echo '</html>';

?>

我在论坛上阅读了一些关于 php、Ajax 和 jQuery 的进度条的帖子,但我只知道一些非常基本的 php。 php新手有简单的解决方案吗? 感谢您的帮助

【问题讨论】:

  • 专业 PHP 提示:不要觉得需要 echo 绝对一切。您可以简单地关闭?&gt;,输出HTML,然后在需要时重新打开&lt;?php。专业 HTML 提示:&lt;font&gt; 标签是 very 过时的,不应再使用。如果您希望字体为蓝色,请使用 CSS。
  • @tom-fenech 同意使用 CSS,只是复制粘贴错误。不需要回显所有内容,但重点是出现任何单个echo。对不起,如果太基本了,但是 close ?&gt; 是什么意思?不是关闭了吗?没有出现 html 输出。感谢您的回答。
  • 我想到了一个解决方案,方法是将 bash 脚本的输出发送到在 iframe 中打开的自动刷新 html。但这似乎是一个棘手的解决方法,应该有一个很好的干净的 php 方法来做到这一点。
  • 这是一般建议,与您的问题不同,这就是为什么我只将其作为评论发布的原因。您可以在脚本中间打开和关闭 PHP 标记,因此您无需将所有 HTML 写入 PHP 字符串。希望这是有道理的。

标签: php bash progress-bar


【解决方案1】:

shell_exec() 阻塞直到子进程完成,请改用popen()

$p = popen('/home/meteo/www/RAMS/olas/generar-mapas.bash', 'r');
while(!feof($p)) {
    echo fgets($p);
    ob_flush();
    flush();
}
pclose($p);

【讨论】:

  • 嗨@mar​​ek,谢谢。似乎 popen 对我不起作用。它不启动任何进程,bash 脚本不运行。
  • 我忘了添加模式,希望对您有所帮助。如果某处有隐式缓冲区,可能需要输出更多字节。
  • 只需要在您的答案中添加2&gt;&amp;1','r'popen
猜你喜欢
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
相关资源
最近更新 更多