Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript PHP在HTML中显示实时Shell输出_Javascript_Php_Html_Bash_Shell - Fatal编程技术网

Javascript PHP在HTML中显示实时Shell输出

Javascript PHP在HTML中显示实时Shell输出,javascript,php,html,bash,shell,Javascript,Php,Html,Bash,Shell,我有一个shell文件shell.sh,它每1秒回显一次hi。我想在我的网站上的一个框中显示我的shell脚本的实时输出 但是,问题是,我的代码没有在框中显示输出。当我点击它时,一切都消失了,我只看到一个白色的页面 下面是我的php文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="wi

我有一个shell文件shell.sh,它每1秒回显一次hi。我想在我的网站上的一个框中显示我的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>
如何使代码在框中运行?并确保输出只留在盒子里,不会溢出。为什么我的代码不显示输出

我正在监视php文件正在运行的服务器地址。当我点击submit时,它将永远加载在白色屏幕上,因为我知道它不会结束,所以我会在浏览器中停止。 我得到以下错误


如何在框中显示实时shell输出?而且它不会溢出框边框?

如果您可以使用节点工具,而不是纯php,请签出并单击

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


然而,当node有这么多关于这个用例的例子时,使用node(或者elixir,或者go,或者ruby,等等)并不像使用node那么简单。

如果您可以使用node工具,而不是纯粹的php,那么请签出并重试

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



然而,当node有这么多关于这个用例的例子时,使用node(或elixir、或go、或ruby等)并不容易。

所说的“实时”是指“实时更新”还是“页面加载时的当前状态”?@GarrettMotzner实时更新!实时实时更新输出。好的。那么,PHP可能是一个不好的选择,因为您需要WebSocket,而PHP需要WebSocket,这不是一个自然的选择。节点可能是最简单的选项。或者,您可以进行轮询,基本上每隔几秒钟读取一个日志文件,并将该内容显示到页面上,但WebSocket更适合您的用例。节点示例可以满足您的需要:“实时”指的是“实时更新”还是“页面加载时的当前状态”?@GarrettMotzner实时更新!实时实时更新输出。好的。那么,PHP可能是一个不好的选择,因为您需要WebSocket,而PHP需要WebSocket,这不是一个自然的选择。节点可能是最简单的选择。或者,您可以进行轮询,基本上每隔几秒钟读取一个日志文件,并将该内容显示到页面上,但是WebSocket更适合您的用例。节点示例可以满足您的需要:创建一个从日志文件读取的php端点是一个坏主意,因为实际上两个进程将使用相同的常规文件shell脚本进行写入,而您的php端点用于读取。当其他进程向php端点写入日志文件时,该日志文件将为空。您需要更改存储空间。例如,Redis或MySQL或其他什么。我不懂@skoriy。我提到的应该尽可能地定期跟踪日志文件,我已经做了很多。如果你所说的是,有时一条溪流不会立即被冲走,那么是的,这是一个问题,但不是一个大问题。我不认为像redis或mysql这样的东西会更好。您仍然有同样的顾虑:确保定期刷新/最终确定数据。对于这个项目的参数来说,redis等很可能是杀伤力太大了。我测试了这个,它工作了。我用shebang将示例shell脚本放入
echo_hi
,并使其可执行。然后我运行了
/echo\u hi>hi.log&less+F hi.log
less
(可能是
tail-f
)能够在脚本生成数据时显示数据。所以我不认为你是对的,@skoriy,或者我误解了你。是的,我不正确地说,一个进程不可能写入一个常规文件,而另一个进程则不可能读取该文件。我只是试图打开一个由Vim编写的文件,但什么也没看到。这是因为vim默认情况下不刷新文件内容。谢谢。正确,因为vim使用缓冲区。在vim中,您必须发送
:e
命令以刷新缓冲区,以及
:w
命令以写入文件,创建一个从日志文件读取的php端点是一个坏主意,因为实际上两个进程将使用相同的常规文件shell脚本进行编写,而php端点用于读取。当其他进程向php端点写入日志文件时,该日志文件将为空。您需要更改存储空间。例如,Redis或MySQL或其他什么。我不懂@skoriy。我提到的应该尽可能地定期跟踪日志文件,我已经做了很多。如果你所说的是,有时一条溪流不会立即被冲走,那么是的,这是一个问题,但不是一个大问题。我不认为像redis或mysql这样的东西会更好。您仍然有同样的顾虑:确保定期刷新/最终确定数据。对于这个项目的参数来说,redis等很可能是杀伤力太大了。我测试了这个,它工作了。我用shebang将示例shell脚本放入
echo_hi
,并使其可执行。然后我运行了
/echo\u hi>hi.log&less+F hi.log
less
(可能是
tail-f
)能够在脚本生成数据时显示数据。所以我不认为你是对的,@skoriy,或者我误解了你。是的,我说一个进程不可能写入一个常规文件,而另一个进程不可能
while true
do 
    echo "Hi"
    sleep 1
done
./shell.sh: line 6: echo: write error: Broken pipe