--我有一个问题要问任何有处理PHP和SQL复杂编码经验的人。我意识到我写了很多东西,但我想详细说明一下。,我对1解决方案有一个问题,我可以想到,但它似乎不太有效,特别是在大量流量的情况下。我有一个存储用户消息的表。我正在设计一个聊天平台,用户可以打开一个chatbox并向他们的朋友发送即时消息。
我需要它的能力,所以当一个用户打开一个盒子从他的在线朋友和发送一条信息,该朋友将有一个chatbox弹出一个或多个消息,盒子将从那里更新。我希望当用户在网站上导航直到关闭该框时,该框还可以维护它中以前发送的消息。当发生这种情况时,我创建了一个已查看的列,可以将该列标记为1,用于该框中的所有消息。从那时起,这些信息就不会弹出。只有新的才会。所以关闭盒子本质上是重置的。
我有一个简单的JSON函数,其中发送信息,php处理程序运行查询并返回所有消息。然后将它们分类到它们的盒子里。
--我认为这是一个解决方案--是在json代码上设置一个刷新时间间隔,并不断检查viewed=0所在的消息。如果有,并且该框还没有弹出,它将把消息html放入这些框中。这方面的问题是,查询将选择用户接收到的所有消息,并且这些消息将不断覆盖框,这些框不会直观地显示,但似乎会对系统造成负担。我试图想出一种方法,它涉及一个查询,该查询检查大于jquery函数中发送的时间戳的时间戳。如果有人有任何建议或有用的文章或信息,我将非常感激。
$.getJSON("../collabrr/chatbox.php?action=view&load=initial&receiver="+username+ "&token="+ token, function(json) {
for(i=0; i < json.length; i++) {
openchat({ data : { user : json[i].user }}); //makes chatbox open up with name of sender
$('#chatbox[data-name="'+json[i].user+'"]>#messagebox').prepend('<div id="chatbox-response">'+json[i].user+':'+json[i].message+'</div>').find('li').fadeIn(1500);
}
});
$sql = 'SELECT timestamp, user, message, receiver
FROM chatbox WHERE receiver=? AND viewed=? ORDER BY timestamp DESC';
$stmt = $conn->prepare($sql);
$result=$stmt->execute(array($_GET['receiver'],0));
}
Field Type Null Key Default Extra
id int(6) NO PRI NULL auto_increment
convo_id varchar(35) NO NULL
timestamp int(11) NO NULL
user varchar(25) NO NULL
receiver varchar(25) NO NULL
message varchar(150) NO NULL
viewed int(1) NO NULL 发布于 2011-05-24 19:04:05
轮询服务器更新是一种解决方案。我可以再给你一个,但是我不知道你是否有足够的资源/时间来实现它。
简而言之,当我实现类似的东西时,我就是这样做的:基本思想是使用Websockets,并将一个套接字打开到后端。最好是node.js使用socket.io,因为它具有非阻塞特性。然后使用雷迪斯及其酒吧/分店功能从客户端A接收更新并将它们推送到客户端B。
当client A加载您的网站时,它通过Websocket连接到正在运行的node.js进程,称为PUBLISHER。Publisher为此客户端订阅redis中的特定频道。客户端B加载您的网站,它也连接到出版商等,就像客户A现在客户A写一些东西,它被发送给出版商。Publisher将此事件发布到它的redis通道。客户B会被注意到,因为他不仅订阅了他的频道,而且还订阅了A的频道(也许是因为他们在你的社交网站上是朋友,如果你有)。
这听起来可能相当复杂,而且实现起来也不那么容易,但也许这可以让您对如何实现这样一个发布/子系统有一个基本的了解。轮询只能作为后备解决方案,因为在高流量的网站上,每100 as或更多的ajax请求会不断地轮询您的will服务器,这将导致极大的负载。
发布于 2011-05-24 17:43:13
听起来,您想要的是Ajax推送解决方案(也称为“彗星”,原因不明)。
这里有一个网站,它解释了如何在PHP/Javascript中这样做:php/start
还请参阅维基百科页面:28编程%29 (呵呵,我注意到还包括了对“彗星”这个名字的解释)
https://stackoverflow.com/questions/6114133
复制相似问题