当页面刷新或按下 F5 时,服务器发送的事件 while 循环需要很多时间来加载页面

server sent events while loop takes so much time for page load, when page is refreshed or F5 is pressed

我正在使用服务器发送的事件来查询数据库中的新记录并将事件显示给用户

这是我的代码

javascript

window.onload = function setDataSource() {

if (!!window.EventSource) {
var source = new EventSource("polling.php");

source.addEventListener("message", function(e) {
  console.log(e.data);
}, false);

source.addEventListener("open", function(e) {
  console.log("OPENED");
}, false);

source.addEventListener("error", function(e) {
  console.log(e);
  if (e.readyState == EventSource.CLOSED) {
    console.log("CLOSED");
  }
}, false); } else {}}

PHP

  <?php
  header("Content-Type: text/event-stream\n\n");
  include_once dirname(__FILE__) . '/db.php';
  session_start();

   while (1) {
   $response = getnewmessages();
   echo 'data: Message '. json_encode1($response)."\n\n";
   ob_flush();
   flush();
   sleep(5);

   }

 function getnewmessages ()
{
// query database and get new records.
 }

它工作正常,每 5 秒获取一次新记录。但是这里的问题是当我手动刷新页面时,页面加载需要很长时间。

当页面加载时,我可以弄清楚 while 循环 仍然执行(至少三次)并暂停页面。经过这么多时间页面开始正常加载。所以我怀疑 while 循环正在暂停执行

你能建议我如何克服这种情况吗? 或如何替换 while 循环?

两个问题:1. PHP 基于文件的会话在使用会话文件时锁定会话文件 2. PHP 无法检测到客户端已断开连接,直到它尝试执行某些输出

因此,最坏的情况是,您的刷新脚本会运行,转储所有更新,然后休眠 5 秒。如果客户端在同一时刻刷新,现在需要 5 时间才能发生另一个循环迭代,并产生一些输出,允许 PHP 意识到连接已关闭。

快速修复:session_write_close() 释放对会话文件的锁定,允许发生并行请求。

长期修复:使用比轮询循环更好的方法来检查消息,例如网络套接字。