循环是否返回服务器端事件所需的多个值?

Is a loop returning multiple value required on server side events?

我正在 php 学习 server side events

起初,几乎每个示例在服务器端都有一个循环,并且 return 使用 ob_flush() / flush() 计算值。所以我试着这样做:

<?php

  header('Content-Type: text/event-stream');
  header('Cache-Control: no-cache');

  // Output a 'waiting message'
  $progress = 0;

  while ($progress < 100) {
     echo 'data:';
     echo $progress;
     echo "\n\n";
     flush();
     ob_flush(); //I tried ob_implicit_flush(true) too
     $progress++;
     sleep(1);
  }

?>

和javascript:

   function start(btn) {    

     var source = new EventSource('/fix/streamingGet.php');

     source.onmessage = function(e) {
         console.log(e.data);
     };

   }

但是直到脚本结束才收到任何东西...... 所以我最终尝试没有无限循环并且一切正常

<?php

      header('Content-Type: text/event-stream');
      header('Cache-Control: no-cache');

      // Output a 'waiting message'
      echo 'data:';
      echo rand(5, 15);
      echo "\n\n";

?>

编辑:没关系,我之前可能在某个地方犯了错误,因为现在可以了

编辑:我的意思是一个循环 return 与 ob_flush/flush 的多个结果(不是无限循环,我的错)

但是我是否需要 return 多次刷新我的数据才能获得 Server Side Envents 的性能?

更新:

根据我的测试和研究,php 似乎不允许多个会话,这使得第一个示例阻止对服务器的任何其他调用。因此,唯一有效的 php 解决方案似乎每次都 return 有价值。我认为这与对服务器进行多次 ajax 调用是一样的。

我猜如果我真的想从服务器流式传输一个值,那么我应该在我的网络应用程序端使用 nodejs。

你的做法基本上是正确的。

但是把ob_flush()放在flush()之前(因为ob_flush()刷新PHP缓冲区给Apache,然后flush()告诉Apache发送its 缓冲内容到客户端)并且将 @ 放在 ob_flush() 之前更健壮(因为如果你关闭了 PHP 缓冲,你可能会得到一个错误消息 - @ 抑制了它)。

(关于在 PHP 中使用无限循环的评论是错误的:在这种情况下它们很好。当浏览器客户端断开连接时,Apache 将杀死 PHP 实例。没有内存泄漏仅来自 运行 一个 infinite/long-running 循环。)

PHP 会话锁定。因此,如果同一用户(同一会话)可能在 SSE 脚本发送数据时访问您站点的其他部分,则您需要 SSE 脚本停止使用会话。因此,从脚本顶部的会话中获取所需的任何数据,然后在进入主循环之前调用 session_write_close()。参见