我正在寻找使用PHP/Javascript(Jquery)实现聊天室,同时具有群聊和私聊功能.
问题是如何以自然的方式不断更新界面,以及如何在私人聊天中显示"X正在输入..."消息.
显而易见的方式似乎是每隔x秒/毫秒javascript ping服务器并在最后一次ping和现在之间获取新消息列表.然而,这可能会使界面看起来有点不自然,如果突然聊天室充斥着5条消息.我希望每条消息都会在输入时显示.
有没有办法使javascript保持与服务器的连续连接,服务器将任何新消息推送到此连接,并且javascript将它们添加到接口,以便它们同时出现,几乎在服务器收到它们之后?
我知道有一些轮询选项需要你安装一些apache模块等,但我很糟糕的系统管理员,因此我更喜欢在共享主机帐户或php上有一个非常容易安装的解决方案/ mysql唯一的解决方案.
我想它们符合我的要求完美,看起来他们应该是简单的实现获得与服务器端事件交手,但我不能让过去一个模糊的错误,什么样子反复被关闭了连接并重新-opened.我尝试的一切都基于这个和其他教程.
PHP是一个单独的脚本:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
function sendMsg($id, $msg) {
echo "id: $id" . PHP_EOL;
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
?>
Run Code Online (Sandbox Code Playgroud)
并且JavaScript看起来像这样(在身体负载上运行):
function init() {
var source;
if (!!window.EventSource) {
source = new EventSource('events.php');
source.addEventListener('message', function(e) {
document.getElementById('output').innerHTML += e.data + '<br />';
}, false);
source.addEventListener('open', function(e) {
document.getElementById('output').innerHTML += 'connection opened<br />';
}, false);
source.addEventListener('error', function(e) {
document.getElementById('output').innerHTML += 'error<br />'; …Run Code Online (Sandbox Code Playgroud) 我一直在用JavaScript编写游戏,现在是时候让它成为多人游戏了.我想使用AJAX长轮询来获得当前的游戏状态,以及实现大厅.
服务器只需要执行基本功能,比如将游戏状态存储在mysql数据库中,检索游戏状态,并格式化记分板.
我认为用PHP编写它是最简单的,但由于它会产生的apache进程数量,这将是一个坏主意.
您有什么推荐的吗?我正在寻找最直接的方法.
编辑:StreamHub似乎很好,但社区版只允许10个并发用户.
在将数据从Web服务器重新加载到前端时,我正在寻找"走的路"(即最有效,最常用,最普遍接受的方式).在最终的应用程序中,我将有几个输出字段,其中必须写入数据,例如:

在最终应用程序中,数据流将彼此不同.这些行必须从服务器重新加载新的最新数据.
我一直在考虑使用Ajax请求来像每秒更新,但必须有另一种方法来做到这一点.Ajax请求将导致大量数据流量.此外,当使用Facebook聊天时,您不必每秒钟等待,几乎立即收到聊天.但是,当我使用Mozilla Firefox的开发人员工具时,我没有看到任何Ajax轮询请求.这让我想到是否会有不同的方式来做到这一点.
我查看了Node.js,但看起来我的主机无法实现.
我听说有人在谈论Ajax Push,我应该使用什么?如果是这样,你能给我一个基本的用法例子吗?
如果没有,那么当拥有多个必须在一秒钟内重新加载的数据流时,会有什么方法呢?
要求是速度和低数据流量.因此,我认为不能连续轮询服务器,因为这会产生巨大的开销.
我认为它没有任何重要性,但我在后端使用PHP5.3,在前端使用jQuery 1.9.1的JavaScript.
我正在研究AJAX,因为我正在使用Javascript和PHP制作实时应用程序.它需要能够在不刷新页面的情况下进行更新并实时更新.
我尝试使用setInterval()轮询服务器但是为了快速我必须每秒都有它.它似乎使用了大量的带宽.它确实有效,我有一个计划与我的托管服务提供商'无限带宽'.虽然网站上有很多压力,但我想使用Push技术.
学习如何设置Push非常困难.从我设法弄清楚,你必须托管某种类型的推送服务器或彗星服务器.我也研究过websockets,但你也必须自己主持它.当我没有服务器计算机时,我不明白该怎么做,我的托管服务提供商网站上没有关于此的文档.
特定主机提供商是否为您托管推送服务器?有没有办法获得服务器而不必托管它?这似乎是一个比投票更好的选择,但同时它似乎非常令人困惑.
我正在尝试创建一个页面,它将从复杂的数据库查询和php解析生成结果集......但这主要是在这一点上......主要的一点是,这需要一两分钟才能完成,并且我希望显示一个进度条而不是一个通用的gif动画"loading ..."图片.
故障将是......
我知道如何将数据返回到ajax查询,但我的问题是我不知道如何连续返回数据以显示进程的状态(例如,扫描的行数百分比).
我查看了EventSource/Server-Sent-Events,它显示了承诺,我只是不太确定如何使其正常工作,或者是否有更好的方法来实现它.
我已经尝试制作一个快速的小模型页面,只使用EventSource工作正常,但当我将其拆分为eventSource调用(监视会话变量以进行更改的页面)和ajax请求(实际数据发送/它崩溃了.
我可能错过了一些明显的东西,或做了一些愚蠢的错误,但这是我所拥有的大部分内容......任何帮助,建议,提示,甚至完全其他方法的建议都会很棒:)
用户页面:
<!DOCTYPE html>
<html>
<head>
<title>Dynamic Progress Bar Example</title>
<script src="script.js"></script>
</head>
<body>
<input type="button" value="Submit" onclick="connect()" />
<progress id='progressor' value="0" max='100' style=""></progress>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
使用Javascript
var es;
function connect() {
startListener();
$.ajax({
url: "server.php",
success: function() {
alert("Success");
},
error: function() {
alert("Error");
}
});
}
function startListener() {
es = new EventSource('monitor.php');
//a message is received
es.addEventListener('message', function(e) {
var result = JSON.parse(e.data);
if (e.lastEventId …Run Code Online (Sandbox Code Playgroud) 有一段时间我一直在玩我的通知系统长轮询的想法,但我从来没有想过一种方法来使我的后端更有效率.
我见过的大多数实现都保持连接打开,并且php每隔几秒查询数据库服务器以查看是否已经添加了新数据.这让我感到震惊,因为javascript重复轮询服务器.
在任何一种情况下,我的数据库服务器都被击中了数万次,这是不可取的.
是否有任何系统可以"警告"执行/休眠长轮询脚本到新数据?
假设我正在同步HTML页面上的文本,存储在localStorage中,从计算机A到计算机B.当用户编辑计算机A上的文本时,我向服务器发送请求,并告诉它更改了哪些文本.有什么方法可以让服务器告诉计算机B有新文本,没有计算机B必须继续检查?我读过有关Comet的内容,但我正在尝试不使用任何库.有办法吗?另外,如果你要推荐Comet,你能举一个使用普通JavaScript和Comet的简单例子吗?
我有个主意,但我不知道它是否有效.在计算机B上,我发送一次请求,让服务器的文件继续延迟响应,直到有一些新文本.这样,它就像长轮询,但请求最终会超时.如果有一种方法可以将超时设置为永远,那么这将变得更加容易.那么,任何人都有任何想法?
PS-我想只使用JavaScript和PHP,并尝试避免使用库.尽管如此,如果您知道可以使用JS和PHP执行此操作的库,请告诉我.
此外,我知道有这样的问题,但我发现那里的答案并不令人满意.
哦,如果有人知道这里的聊天是如何工作的,你能告诉我吗?
tl; dr:我想从服务器向HTML页面发送请求,或者让HTML发送一个请求,该请求保持活动状态直到创建适当的响应.
我有生成倒计时器所需的脚本,该计时器有一个启动和恢复按钮.我试图做的是在一个控制另一页上的计时器的页面上有启动,停止和重置按钮.因此,如果用户X访问page.html,他们将看到一个0的计时器.管理员X访问admin.html,他们看到计时器为0,但他们也有一个启动,停止和重置按钮.当管理员点击按钮时,page.html上的计时器开始倒计时.如果另一个用户在计时器倒计时时访问该页面,他们将看到计时器当前所在的位置.如果有人有任何代码想法,我可以参考这个网站上的其他答案,或者我需要的代码,我将非常感激.
---真实的场景我们有skype的人正在做一个节目,他们需要知道什么时候休息一下.这个想法是制作人可以按下一个按钮,开始倒数计时器让他们知道他们有60秒直到休息.我在网页上想要这个的原因是因为页面上还有其他东西正在skype上的人正在关注.所以我想要一些他们不能错过的东西.我可以访问一个SQL服务器,并可以同时执行php和javascript.我猜我需要做两者的某种组合.
更新感谢大家的帮助.
我正在更新这个,因为我意识到我可能会让事情变得比他们现在需要的更复杂.每30分钟休息一次,所有节目将从一小时开始或在30分钟后开始.我终于找到了完美的剧本.虽然由于正常的时钟漂移可能略微偏离,但无论谁进入页面,它实际上都应该显示相同.
<script>
function addZero(i)
{
if (i<10)
{
i="0" + i;
}
return i;
}
setInterval(function() {
function addZero(i)
{
if (i<10)
{
i="0" + i;
}
return i;
}
var d = new Date();
var s =(d.getSeconds());
var m =(d.getMinutes());
var x = document.getElementById("timer");
var c = addZero(30 - m) + ":" + addZero(60 - s);
var d = addZero(60 - m) + ":" + addZero(60 - s);
if (m < 30) {
t = c …Run Code Online (Sandbox Code Playgroud) php ×7
comet ×5
javascript ×5
ajax ×3
ajax-polling ×2
jquery ×2
apache ×1
dynamic ×1
html5 ×1
http ×1
long-polling ×1
mysql ×1
real-time ×1
reverse-ajax ×1
server-push ×1
stream ×1
timer ×1