我想實作一個實時顯示 bash 腳本輸出的網頁。
我試過這個簡單的例子:
html頁面:
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1">
</head>
<body>
<div id="result">put data out here</div>
<script type="text/javascript">
function eventsourcetest(){
var source = new EventSource("http://localhost/prova_ping.php");
source.addEventListener("message", function(e) {
if (e.data !== "") {
data=JSON.parse(e.data);
document.getElementById("result").innerHTML = e.data "<br>";
}
}, false);
source.addEventListener("error", function(e) {
alert("errore!");
source.close();
}, false);
}
</script>
<p><button type="button" onclick="eventsourcetest();">ping google.com</button>
</body>
</html>
prova_ping.php:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$proc = popen("ping -c4 www.google.com", 'r');
while (!feof($proc))
{
echo "risultato: " . fread($proc, 4096) . "\n\n";flush();ob_flush();
}
?>
使用以下命令檢查 php 頁面:
wget -O - -q "http://localhost/prova_ping.php"
我實時獲得輸出,但是當我在 firefox 中加載 html 頁面并按下按鈕時,什么也沒有發生,我沒有從瀏覽器中看到任何錯誤,從 apache 查看 error.log。
谷歌搜索我發現了許多類似的例子,通常在內部 php 命令上隨著時間的推移一切正常,但沒有任何關于 bash 腳本的內容,關于 ping 對我來說不起作用!
如果有人可以幫助我,任何建議將不勝感激。
預先感謝,
埃米利奧
uj5u.com熱心網友回復:
您可以像這樣修改 HTML 頁面:
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1">
</head>
<body>
<div id="result">put data out here</div>
<button onclick="window.location.href='http://localhost/prova_ping.php';">Ping Google.com</button>
</body>
</html>
uj5u.com熱心網友回復:
首先更改此行:
echo "risultato: " . fread($proc, 4096) . "\n\n";flush();ob_flush();
進入:
echo "data " . fread($proc, 4096) . "\n\n";@ob_flush();@flush();
關鍵是訊息必須是“資料”。(該標準確實允許其他訊息,但該功能從來沒有實際用途。)
我已經把ob_flush()之前flush()。(ob_flush用于 PHP 緩沖區,因此您需要先重繪 它們,然后再flush()重繪 apache 緩沖區。)@只是抑制錯誤訊息 - 如果您關閉了 PHP 緩沖區,它會用噪音填充您的輸出。
您需要做的另一個修復是您沒有發送 JSON 資料,因此JSON.parse()會導致錯誤。我剛換data=JSON.parse(e.data);到data=e.data;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/351565.html
