编码技术效率问题:聊天室设计

时间:2011-05-24 17:06:13

标签: php jquery sql

对于在PHP,Jquery和SQL中处理复杂编码经验的人,我有一个问题。我意识到我写了很多,但我想详细说明。我遇到了 1 解决方案的问题,我可以想到但是它看起来效率不高,特别是大量的交通。我有一个存储来自用户的消息的表。我正在设计一个聊天平台,用户可以在其中打开聊天框并向其他朋友发送即时消息。

我需要能够拥有它,所以当用户从他的在线朋友打开一个盒子并发送消息时,该朋友将弹出一个消息或消息的聊天框,并且该盒子将从那里更新。当用户浏览网站直到他关闭框时,我希望该框还能在页面之间保持先前发送的消息。发生这种情况时,我创建了一个已查看的列,我可以将该列标记为1,表示当时该框中的所有邮件。从那时起,这些消息就不会弹出。只有新的会。因此,关闭该框基本上会重置它。

我有一个简单的JSON函数,其中发送信息并且php处理程序运行查询并返回所有消息。然后将它们分类到盒子里。

我认为一个解决方案是在json代码上放置一个刷新时间间隔,并在查看次数= 0的情况下不断检查消息。如果有,并且该框尚未弹出,它将在框中显示消息。这样的问题是查询将选择用户已收到的所有消息,并且他们将不断覆盖不会在视觉上显示但在系统上显得过重的方框。我试图想出一种涉及查询的方法,该查询检查的时间戳大于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    

2 个答案:

答案 0 :(得分:1)

听起来你想要的是Ajax推送解决方案(出于某种未知原因也被称为'Comet')。

这是一个解释如何在PHP / Javascript中执行此操作的网站:http://www.zeitoun.net/articles/comet_and_php/start

另见维基百科页面:http://en.wikipedia.org/wiki/Comet_%28programming%29 (嘿,我注意到还包括对'Comet'这个名字的解释)

答案 1 :(得分:1)

轮询服务器以获取更新是一种解决方案。我可以给你另一个,但是我不知道你是否有可用的资源/时间来实现它。

很简单,这就是我实现类似的东西时所做的:基本思想是使用Websockets并保持套接字向后端开放。 node.js优先使用socket.io,因为它具有非阻塞性。然后,您将使用redis及其pub/sub功能从客户端A接收更新并将其推送到客户端B.

当客户端A加载您的网站时,它通过Websocket连接到正在运行的node.js进程,称之为PUBLISHER。 Publisher为此客户端订阅redis中的特定频道。客户端B加载您的网站,它也像客户端A一样连接到发布者等。现在客户端A写了一些内容并将其发送到发布者。 Publisher将此事件发布到其redis频道。客户B受到关注,因为他不仅订阅了他的频道,还订阅了A频道(可能是因为如果你有频道,他们就是你社交网站上的朋友)。

这听起来可能相当复杂,并不容易实现,但也许这可以让您对如何实现这样的发布/订阅系统有一个基本的了解。轮询只应作为后备解决方案,因为在高流量的网站上,每隔100毫秒左右用ajax请求轮询您的网络服务器将导致极端负载。