[英]PHP: Outputting the system / Shell_exec command output in web browser
我尝试使用shell_exec以与在终端中显示的方式(同时)相似的方式在网页上输出简单的ping命令; 但它只在完成执行后显示,而我需要它在终端显示时显示,
我的代码是
<?php
$i= shell_exec("ping -c 4 google.com");
echo "<pre> $i <pre>";
?>
它正在等待一段时间并将整个东西倾倒在一个镜头上...... PHP可以识别每行的输出并将其显示在网页上
编辑
我也尝试了这个
<?php
$proc = popen("ping -c 4 google.com", 'r');
echo '<pre>';
while (!feof($proc)) {
echo fread($proc, 4096);
}
echo '</pre>';
?>
但我仍然得到相同的结果..
编辑
当我尝试在终端中执行这个PHP代码时,(php test.php)它正常工作,就像我们直接在服务器上执行ping一样。 但在网页上它仍然是相同的。
嗯,来自网络浏览器的奇怪行为。 我正在使用此代码:
<?php
ob_end_flush();
ini_set("output_buffering", "0");
ob_implicit_flush(true);
function pingtest()
{
$proc = popen("ping -c 5 google.com", 'r');
while (!feof($proc))
{
echo "[".date("i:s")."] ".fread($proc, 4096);
}
}
?>
<!DOCTYPE html>
<html>
<body>
<pre>
Immediate output:
<?php
pingtest();
?>
</pre>
</body>
</html>
在浏览器中,在收到所有字节后显示内容。 但是,内容实际上是按时交付的,请做这个测试:
wget -O - -q "http://localhost/ping.php"
您将看到响应是由php&apache2按时提供的。
我在长期任务中使用这种执行一段时间,但使用更复杂的解决方案:
接口(test.html)
<!DOCTYPE html>
<html>
<head>
<title>Simple EventSource example</title>
</head>
<body>
<script type="text/javascript">
function eventsourcetest() {
var ta = document.getElementById('output');
var source = new EventSource('test.php');
source.addEventListener('message', function(e) {
if (e.data !== '') {
ta.value += e.data + '\n';
}
}, false);
source.addEventListener('error', function(e) {
source.close();
}, false);
}
</script>
<p>Output:<br/><textarea id="output" style="width: 80%; height: 25em;"></textarea></p>
<p><button type="button" onclick="eventsourcetest();">ping google.com</button>
</html>
服务器端组件(test.php)
<?php
ob_end_flush();
ini_set("output_buffering", "0");
ob_implicit_flush(true);
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
function echoEvent($datatext) {
echo "data: ".implode("\ndata: ", explode("\n", $datatext))."\n\n";
}
echoEvent("Start!");
$proc = popen("ping -c 5 google.com", 'r');
while (!feof($proc)) {
echoEvent(fread($proc, 4096));
}
echoEvent("Finish!");
将两个文件放在Web服务器上的一个位置并输入test.html,我认为这是您从一开始就要查找的内容。
它不是PHP的问题,或者说它是php和浏览器之间的共享问题。
在PHP中:确保输出缓冲关闭,您可以通过在输出任何内容之前运行ob_end_clean()
来完成此操作。
由于这篇SO帖子建议您必须填充输出为512字节的第一个字符串或通过http标头指定字符集编码。 填充解决方案可能是解决此问题的最简单方法,其基本echo(str_pad("Live Ping Test!",512));
如下: echo(str_pad("Live Ping Test!",512));
然后开始回应你的fread
结果。
您可能希望尝试使用flush()在其准备就绪时刷新输出,并使用passthru()执行命令。
Carlos C Soto是对的,你必须使用javascript。 EventSource是要走的路。 基本上,它的javascript代码将不断调用url
您可以在文件中编写ping的输出,并编写将读取最后一行的PHP脚本,然后使用eventsource调用此脚本。
搜索Web上的“服务器已发送事件”以查找更多示例
如果可以使用apache执行用户解析。 如果您的root用户不同且服务器用户不同,那么它将不允许执行命令行命令。
我测试了Carlos在我身边的答案......
我必须添加flush(); ob_flush(); 让它正常工作(两者都需要冲洗和ob_flush)
像这样
<?php
$proc = popen("ping -c 5 google.com", 'r');
while (!feof($proc))
{
echo "[".date("i:s")."] ".fread($proc, 4096).'<br>';flush();ob_flush();
}
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.