使用PHP获取实时结果shell

时间:2017-02-08 14:36:26

标签: php batch-file

我必须执行批处理文件(即 .bat )并在HTML页面上获取结果。

我用这个PHP代码得到了一个结果:

g

现在问题是我只在批处理文件执行完成时得到一个结果,并且我希望实时得到结果,比如通过命令行运行。

2 个答案:

答案 0 :(得分:0)

在PHP的shell_exec文档页面的注释中找到

  

如果您尝试在shell_exec中运行诸如“gunzip -t”之类的命令并获得空结果,则可能需要在命令末尾添加2>& 1,例如:

     

不会一直有效:   echo shell_exec(“gunzip -c -t $ path_to_backup_file”);

     

应该工作:   echo shell_exec(“gunzip -c -t $ path_to_backup_file 2>& 1”);

     

在上面的示例中,gunzip输出开头的换行符似乎阻止了shell_exec打印其他任何内容。希望这可以节省一两个小时的其他人。

我相信这是你真正需要做的。

参考:http://php.net/manual/en/function.shell-exec.php#106250

答案 1 :(得分:0)

正如您在问题的评论中已经提到的那样,您需要以可以与之通信的方式分叉流程。使用exec()之类的实现函数是不可能的。

请看一下这个简单的例子:

档案test.sh

#!/bin/bash
echo start counting ...
for counter in 1 2 3
do
    echo * counter is at value $counter *
    sleep 3
done
echo ... finished counting.

档案test.php

<?php
$descriptorspec = array(
   0 => array('pipe', 'r'),
   1 => array('pipe', 'w'),
);

echo "forking process ...\n";
$process = proc_open('./test.sh', $descriptorspec, $pipes);

if (is_resource($process)) {
    echo "... successfully forked process ...\n";

    while (!feof($pipes[1])) {
        echo fread($pipes[1], 1024);
        flush();
    }

    echo "... process has finished ...\n";
    fclose($pipes[0]);
    fclose($pipes[1]);
    echo "... pipes closed ...\n";

    proc_close($process);
    echo "... process closed.\n";
} else {
    echo "... failed to fork process!\n";
}

该php脚本的测试运行的明显输出是:

forking process ...
... successfully forked process ...
start counting ...
* counter is at value 1 *
* counter is at value 2 *
* counter is at value 3 *
... finished counting.
... process has finished ...
... pipes closed ...
... process closed.

但这里有趣的部分是,一旦分叉过程完成,这个输出是一次发送,而是你所谓的“实时方式”。因此,前四行立即出现,接下来的两行每次延迟3秒,然后输出的其余部分。

请注意,上面的示例是作为Linux CLI环境的演示。所以它并不关心html标记,而是输出纯文本,并依赖于bash作为分叉进程的shell环境。显然,你必须根据自己的需要调整这个简单的演示。