【问题标题】:PHP Show Real Time Shell Output within HTMLPHP 在 HTML 中显示实时 Shell 输出
【发布时间】:2020-05-07 20:58:10
【问题描述】:

我有一个 shell 文件 shell.sh 每 1 秒回显一次。我想在我的网站上的一个框中显示我的 shell 脚本的实时输出。

但是,问题在于,我的代码没有在框中显示输出。当我点击它时,一切都消失了,我只看到一个白页。

以下是我的php文件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <form method="GET" action="splitter.php">
        <label for="folderPath">Folder Path:</label>
        <input type="text" id="folderPath" name="folderPath">
    <br></br>
        <fieldset id="khz">
            <p>Please Choose Khz: </p>
          <input type="radio" value="8khz" name="khz"> 8khz <br>
          <input type="radio" value="16khz" name="khz"> 16khz <br>
        </fieldset>
    <br></br>
        <fieldset id="audio-type">
            <p>Please Choose Type: </p>
          <input type="radio" value="C12" name="group2"> Channel 1 & 2 <br>
          <input type="radio" value="LR" name="group2"> Left to Right <br>
        </fieldset>
        <div class="spaceh10"></div>
        <input class = "submitButton" type="submit" value="Submit">

    <div class="spaceh10"></div>
    <div style="width:500px;height:100px;border:1px solid #000;">
    <?php
    if (isset($_GET['folderPath']) && !empty($_GET['folderPath']) && 
    isset($_GET['khz']) && isset($_GET['group2'])) {

    $folderPath = $_GET['folderPath'];
    $khz = $_GET['khz'];
    $group2 = $_GET['group2'];
    #$folderPath $khz $group2
    $command = './shell.sh';
    while (@ ob_end_flush()); // end all output buffers if any

    $proc = popen($command, 'r');
    echo '<pre>';
    while (!feof($proc)){
        echo fread($proc, 4096);
        @ flush();
    }
    echo '</pre>';
    }
    ?>
    </div>
</body>
</html>

下面是我的shell脚本

while true
do 
    echo "Hi"
    sleep 1
done

如何让我的代码在盒子中运行?并确保输出只是留在盒子里并且不会溢出。为什么我的代码没有显示输出?

我正在监控我的 php 文件正在运行的服务器地址。当我点击提交时,它会永远加载在白屏上,因为我知道它不会结束,所以我在浏览器中停下来。 我收到以下错误。

./shell.sh: line 6: echo: write error: Broken pipe

如何在一个框中显示我的实时 shell 输出?并且不会溢出框边框?

【问题讨论】:

  • “实时”是指“实时更新”还是“页面加载时的当前状态”?
  • @GarrettMotzner 实时更新!输出实时实时更新。
  • 好吧,好吧。那么,PHP 可能是一个糟糕的选择,因为你想要 websockets,而 PHP can 做 websockets,它不是一个自然的选择。 Node 可能是最简单的选择。
  • 另外,您可以进行轮询,基本上每隔几秒读取一个日志文件并将该内容显示到页面,但 websockets 更适合您的用例。
  • 满足您需求的节点示例:github.com/joewalnes/websocketd

标签: javascript php html bash shell


【解决方案1】:

如果您可以使用节点工具,而不是纯 php,请查看 websocketdthis question

PHP 不是实时应用程序的最佳选择,因为通常 php 应用程序寿命很短,但您所要求的只是 WebSocket 服务器。或者,如果你真的想使用 php,你可以使用轮询来调用从日志文件中读取的 php 端点。

但是,it is possible,并不像使用 node(或 elixir,或 go,或 ruby​​ 等)那么简单,因为 node 存在更多此用例的示例。

【讨论】:

  • 创建一个从日志文件读取的 php 端点是一个坏主意,因为实际上两个进程将使用相同的常规文件 - 用于写入的 shell 脚本和用于读取的 php 端点。当其他进程正在写入日志文件时,php 端点的日志文件将为空。您需要更改存储。例如,Redis 或 MySQL 或其他。
  • 我不关注,@skoriy。我提到的应该尽可能定期跟踪日志文件,我已经做了很多。如果您所说的是有时流没有立即刷新,那么是的,这是一个问题,但不是一个大问题。而且我看不出像 redis 或 mysql 这样的东西会更好。您仍然有同样的担忧:确保定期刷新/最终确定数据。而对于这个项目的参数来说,redis 之类的就大材小用了,很有可能。
  • 我对此进行了测试,它确实有效。我将示例 shell 脚本放入 echo_hi 并带有 shebang 并使其可执行。然后我跑了./echo_hi &gt; hi.log &amp; less +F hi.logless(可能是tail -f)能够在脚本生成数据时显示数据。所以我不认为你是正确的,@skoriy,或者我误解了你。
  • 是的,我说一个 proc 不可能写入常规文件而另一个 proc 从该文件中读取是不正确的。我只是试图打开一个由 Vim 编写的文件,但我什么也没看到。之所以如此,是因为 vim 默认不刷新文件内容。谢谢。
  • 正确,因为 vim 使用缓冲区。在 vim 中,您必须发送 :e 命令来刷新缓冲区,并发送 :w 命令来写入文件,否则您将看不到或导致任何更改。
猜你喜欢
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多