php - 如何实现服务器发送事件和 bash 脚本的工作解决方案
问题描述
我想实现一个实时显示 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 对我来说不起作用!
如果有可以帮助我的人,任何建议都将不胜感激。
预先感谢,
埃米利奥
解决方案
首先更改这一行:
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;
推荐阅读
- c# - 如何在路径中创建每个不存在的文件夹?
- python-3.x - 如何正确配置教练预设
- android - 如何使用 ScrollView 设置布局?
- firebase - 以“用户名”作为提供者的 Firebase 身份验证
- vb.net - 无法编译此 Visual Basic 程序
- python - DateTimeIndex.to_period 为许多偏移别名引发 ValueError 异常
- android - Android自定义通知声音不适用于Redmi和Vivo等中国手机
- java - 线程。停止服务器
- java - Kurento 生成的 MP4 文件无法在 Safari 浏览器上播放
- java - 来自 maven 依赖项的 ClassNotFoundException 但类存在并且在类路径中