Php 当刷新页面或按下F5时,循环占用页面加载的大量时间,服务器发送事件
我使用服务器发送的事件来查询数据库中的新记录,并向用户显示事件 这是我的密码 javascriptPhp 当刷新页面或按下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);
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秒,在最坏的情况下肯定会出问题,对吧?如果我错了,请纠正我