最近,我要为我的网站制作一个即时通知系统。在这种情况下,我听说COMET是必不可少的。
我一直在搜索PHP&彗星已经有一段时间了,但是,指南&我发现的文章似乎只是循环中的ajax请求。例如,有一个基本的javascript代码,每隔2秒从PHP文件中获取值并输出到HTML。据我所知,应该是COMET将新值推送到HTML,因此,循环应该在服务器端,而不是客户端。我母语中的一半文章使用setInterval()并每隔X秒联系PHP文件。
所以,我有一些问题要问你。
答案 0 :(得分:3)
您必须使用客户端脚本(AJAX),因为必须轮询服务器。如果没有打开连接,服务器不能简单地将消息发送到某人的浏览器。 我对HTML5 websockets并不太熟悉,但我相信这可以让你与服务器建立持久的联系,但是HTML5浏览器并没有被广泛用作“公共”网站上的解决方案。
轮询工作多长时间是从浏览器发送异步请求的时间很长(例如30秒),当请求到达服务器时,它会检查新消息,但是当有现在要显示的消息,而不是直接输出结果,它进入无限循环,轮询数据库,例如每秒(使用sleep
推迟查询),直到找到消息。找到消息后,它会终止循环并输出结果。如果30秒后没有消息,则脚本超时并发回一个空请求。
因此请求可以在0到30秒之间发回。一旦请求到达浏览器,它就会被处理,并发送一个新的30秒请求。
关于你的问题;
答案 1 :(得分:1)
我不知道究竟什么是COMMET。但为了这个目的,你有很多解决方案。 一,正如你所提到的那样是ajax的长期投票。很简单。而不是只记录新的浏览器(HtML5)。
另一个选项是“server-sent -event”。它需要带有HTML5的浏览器,但它保持连接不活动而不进行轮询:
客户端:
if (window.EventSource) {
window.onload = function() {
window.scrollTo(0,1);
setTimeout(
function() {
var source = new EventSource("events.php");
source.onmessage = function (event) {
document.body.innerHTML += event.data + "<br>";
};
}, 1000);
};
} else {
document.write("Please visit this page in a browser that supports EventSource to see the test");
}
服务器:
if ($_SERVER['HTTP_ACCEPT'] === 'text/event-stream') {
header('Content-Type: text/event-stream');
echo "data: This is the first event\n\n";
flush();
$i = 5;
while (--$i) {
sleep(1);
$time = date('r');
echo "data: The server time is: {$time}\n\n";
flush();
}
} else {
echo 'This demo is for use with an EventSource compatible browser.';
}
好运。