服务器发送事件,而循环花费了很多时间进行页面加载,刷新页面或按下F5

时间:2015-06-18 18:35:54

标签: php server-sent-events

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

这是我的代码

的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 个答案:

答案 0 :(得分:3)

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

因此,最糟糕的情况是,您的刷新脚本会运行,转储任何更新,然后睡眠5秒钟。如果客户端在同一时刻刷新,那么现在需要5次进行另一次循环迭代,并生成一些输出,允许PHP意识到连接已关闭。

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

长期修复:使用比轮询循环更好的内容来检查消息,例如的WebSockets。