我必须执行批处理文件(即 .bat )并在HTML页面上获取结果。
我用这个PHP代码得到了一个结果:
g
现在问题是我只在批处理文件执行完成时得到一个结果,并且我希望实时得到结果,比如通过命令行运行。
答案 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打印其他任何内容。希望这可以节省一两个小时的其他人。
我相信这是你真正需要做的。
答案 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环境。显然,你必须根据自己的需要调整这个简单的演示。