首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编码技术效率问题: chatbox设计

编码技术效率问题: chatbox设计
EN

Stack Overflow用户
提问于 2011-05-24 17:06:13
回答 2查看 487关注 0票数 0

--我有一个问题要问任何有处理PHP和SQL复杂编码经验的人。我意识到我写了很多东西,但我想详细说明一下。,我对1解决方案有一个问题,我可以想到,但它似乎不太有效,特别是在大量流量的情况下。我有一个存储用户消息的表。我正在设计一个聊天平台,用户可以打开一个chatbox并向他们的朋友发送即时消息。

我需要它的能力,所以当一个用户打开一个盒子从他的在线朋友和发送一条信息,该朋友将有一个chatbox弹出一个或多个消息,盒子将从那里更新。我希望当用户在网站上导航直到关闭该框时,该框还可以维护它中以前发送的消息。当发生这种情况时,我创建了一个已查看的列,可以将该列标记为1,用于该框中的所有消息。从那时起,这些信息就不会弹出。只有新的才会。所以关闭盒子本质上是重置的。

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

--我认为这是一个解决方案--是在json代码上设置一个刷新时间间隔,并不断检查viewed=0所在的消息。如果有,并且该框还没有弹出,它将把消息html放入这些框中。这方面的问题是,查询将选择用户接收到的所有消息,并且这些消息将不断覆盖框,这些框不会直观地显示,但似乎会对系统造成负担。我试图想出一种方法,它涉及一个查询,该查询检查大于jquery函数中发送的时间戳的时间戳。如果有人有任何建议或有用的文章或信息,我将非常感激。

代码语言:javascript
复制
$.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    
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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服务器,这将导致极大的负载。

票数 1
EN

Stack Overflow用户

发布于 2011-05-24 17:43:13

听起来,您想要的是Ajax推送解决方案(也称为“彗星”,原因不明)。

这里有一个网站,它解释了如何在PHP/Javascript中这样做:php/start

还请参阅维基百科页面:28编程%29 (呵呵,我注意到还包括了对“彗星”这个名字的解释)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6114133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档