我正在开发一个支持PHP的查询聊天,目前我正在使用ajax从服务器中提取数据并将其显示在聊天室中,但这会使用多个ajax请求到客户端计算机,从而导致它降低abit ....
这就是我正在使用ajax和yii2
function getdata() {
$.get("controller/action").
done(function(){
//process json
$("#chatbox").html(data);
})
}
然后我正在使用
windows.setInterval(getdata(),1000);
有没有更好的方法来获取这个子数据而不使用ajax和jquery
我已查看This link但不是很有用
答案 0 :(得分:5)
你可以使用socket.io或websockets api这是ajax的替代选项,所以,通过使用socket.io,jquery,php或nodejs,可以在不使用ajax的情况下建立一对一的私人聊天,以下链接将帮助你如何建立私人聊天。
答案 1 :(得分:2)
更好的方法是使用nodejs
代替php
。您可以查看此链接,以获得可以使用的非常好的聊天实现。
虽然php chat有你提到的性能问题,但nodejs并不是因为当有东西需要推送时,它不会轮询消息而是将它们推送到客户端。此外,您还可以立即使用现成的解决方案(当然您必须对其进行修改),这将节省您的开发时间。
但是如果你仍然想要使用php方式,那么你有以下选择:
答案 2 :(得分:1)
您提到从数据库中获取数据,但有人可能会说,为了聊天应用程序的目的,数据库是偶然的。也许你想存储聊天记录,数据库是一个自然的地方,但主要功能是传输消息。所以你使用数据库作为某种消息缓冲区。
Websockets似乎是其他人提到的最佳选择。如果你想要PHP服务器端,除了你的问题评论中提到的Kraken框架,你可以看一下Ratchet library。他们有一个在他们的网站上进行简单聊天的教程:http://socketo.me/docs/hello-world
基本上,您需要另一个服务器端进程(除了您的网络服务器)来接收和广播聊天消息。在该教程之后,在onMessage
类的Chat
方法中,如果需要,您可以在数据库中插入,最好是异步。
客户端,您需要使用Javascript连接到websocket。简单的例子:
var conn = new WebSocket('ws://localhost:8080');
conn.onopen = function(e) {
console.log("Connection established!");
};
conn.onmessage = function(e) {
console.log('Message received: ' + e.data);
addMessageToChatbox(e.data);
};
$('#yourChatInput').keypress(function(e) {
if(e.which == 13) { // "enter" was pressed
conn.send($(this).val());
$(this).val('');
}
});
function addMessageToChatbox(message) {
//
}
答案 3 :(得分:0)
你可以做一个技巧,假设数据不是json它是javascript文件声明单个变量现在你必须将它添加到文档,如
下面是你的data.php(由php生成的javascript)
在php中
echo 'var x = {"name":"Anshuman"}'
在javascript中
var s = document.createElement( 'script' );
s.setAttribute( 'src', 'data.php');
s.onload=callback;
document.body.appendChild( s );
function callback(){
console.log(x);
}
答案 4 :(得分:-6)
没有任何明智的方法。你必须以某种方式带来新数据吗? 要做到这一点的方法是重新加载页面或通过Javascript / Ajax来避免重新加载。
您可以将更新设置为单面,以便当人员A写入人员B时,将对新邮件的提交执行请求。这意味着除非发送一条消息,否则不会检索新消息。 (不实用)
另一种方法是在某个地方注明最后一个消息时间,你可以反复检查。 如果时间发生变化,您可以获取新数据,但这不会修复请求数量......只会传输数据量。
我建议你看一下json / php中数据的大小。您是否进行过测试以了解测试的持续时间或执行情况?
如果您愿意,我可以将您推荐给使用NON jquery请求的this post。