Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当刷新页面或按下F5时,循环占用页面加载的大量时间,服务器发送事件_Php_Server Sent Events - Fatal编程技术网

Php 当刷新页面或按下F5时,循环占用页面加载的大量时间,服务器发送事件

Php 当刷新页面或按下F5时,循环占用页面加载的大量时间,服务器发送事件,php,server-sent-events,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);

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

这是我的密码

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.
 }

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

所以,最坏的情况是,刷新脚本运行,转储所有更新,然后休眠5秒钟。如果客户机在同一时刻刷新,现在需要5次循环迭代,并生成一些输出,让PHP意识到连接已关闭

快速修复:
session\u write\u close()


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

我很好奇您是否看过
webSocket API
。我个人从来没有尝试过像你这样的方法,因为它不能很好地扩展到我工作的任何地方。我认为即使是从客户端进行轮询也是一个更好的选择。非常感谢..session_write_close()帮助我快速加载页面,如何克服第二个问题?如果我把5秒换成20秒,在最坏的情况下肯定会出问题,对吧?如果我错了,请纠正我