首页 > 解决方案 > 如何实现服务器发送事件和 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 对我来说不起作用!

如果有可以帮助我的人,任何建议都将不胜感激。

预先感谢,

埃米利奥

标签: phpbashserver-sent-events

解决方案


首先更改这一行:

  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;


推荐阅读