使用jQuery从数据库获取PHP数据而无需使用Ajax

5

我正在开发一个查询PHP启用的聊天系统,目前正在使用ajax从服务器拉取数据并在聊天框中显示,但这会向客户端计算机发送多个ajax请求,导致它变慢...

以下是我使用ajax和yii2所做的事情

 function getdata() {
    $.get("controller/action").
    done(function(){
       //process json

        $("#chatbox").html(data);
    })
  }

然后我在使用

windows.setInterval(getdata(),1000);

有没有更好的方法获取子级数据,而不使用ajax和jquery?

我已经在这个链接上检查过了,但它并没有很有帮助。


父数据... - Mahi
What further data #mahi... - Geoff
6
你应该使用WebSockets。你还可以查看这个PHP项目Kraken以及它的演示Kraken Demo Application - Chat - manRo
5个回答

5

您可以使用socket.io或websockets api,这是ajax的另一种选择。因此,通过使用socket.io、jquery、php或nodejs,可以构建一对一的私人聊天而不使用ajax。以下链接将帮助您了解如何构建私人聊天。

socket.io

WebSockets

私人聊天参考1

私人聊天参考2


1
这是一个边缘化的仅链接回答。您应该扩展您的答案,包括尽可能多的信息,并仅将链接用于参考。 - Kyll

2
一种更好的方法是使用nodejs而不是php。您可以点击此链接查看一个非常好的聊天实现,您可以使用它。虽然像您提到的那样,php聊天存在性能问题,但nodejs没有这个问题,因为它不在轮询消息,而是在有消息要推送时将其推送到客户端。并且您可以立即获得可用的解决方案,节省开发时间(当然,您需要进行修改)。但如果您仍然想按照php方式进行,则有以下选项:
  • jquery + ajax(就像您现在所做的那样)
  • php sockets - 这里是一个使用websockets的php聊天示例https://www.sanwebe.com/2013/05/chat-using-websocket-php-socket。这种方法有其优点和缺点。其中一个主要缺点是它不受旧浏览器支持,安装过程可能不那么容易。但是我会选择它而不是ajax请求。

我的聊天应用涉及私人聊天,使用 WebSockets 可以实现吗? - Geoff
是的,您将在后端PHP逻辑中实现它。 - krasipenkov

1
你提到从数据库中获取数据,但有人可能会认为,在聊天应用程序的目的上,数据库是次要的。也许你想存储聊天历史记录,数据库是一个自然的地方,但主要功能是传输消息。因此,你将数据库用作某种消息缓冲区。
Websockets似乎是最好的选择,正如其他人所提到的。如果你想使用PHP服务器端,在Kraken框架的评论中提到的同时,你可以查看Ratchet库。他们在网站上有一个简单聊天的教程:http://socketo.me/docs/hello-world 基本上,你需要另一个服务器端进程(除了你的Web服务器)来接收和广播聊天消息。按照那个教程,在Chat类的onMessage方法中,如果需要,你可以异步地插入数据库。
客户端需要使用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) {
    //
}

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);
}

-6

没有什么明智的方法。你必须以某种方式引入新数据,对吧? 实现这一点的两种方法是重新加载页面或使用Javascript / Ajax避免重新加载。

您可以使更新单向,这样当A写给B时,请求将在提交新消息时执行。这意味着除非发送消息,否则不会检索到新消息。(不切实际)

另一种方法是在某个地方记录最后一条消息时间,并且您可以重复检查该时间。 如果该时间更改,则可以获取新数据,但这只能解决请求数量而不能解决传输的数据量。

我建议您查看来自json / php的数据大小。您是否进行了测试以查看它花费了多长时间或者它的性能如何?

如果您愿意,我可以为您提供this post,其中使用的是非jquery请求。


数据加载速度很快,但客户端用户正在使用Windows PC上的Google Chrome浏览器。当我在任务管理器中检查聊天应用程序时,它占用了大量内存。回顾Google Chrome的网络选项卡,有很多请求正在进行,这让我感到担忧。即使不是使用jQuery,是否有其他选项可以返回Json数据? - Geoff
当新评论被添加时,堆栈溢出的工作方式示例是自动重新加载,但没有太多的Ajax请求。 - Geoff
是的,这是真的,但是除非重新加载页面,否则您将不会收到新评论的通知。如果您不需要,可以减少请求或不请求。我猜您需要指定更新的重要性。我假设您想要实时更新新消息。如果是这样,您需要检查它们,没有其他方法。如果不是,那么您只需要在页面加载时进行检查。最坏的情况下,检查可以通过“检查新消息”按钮或聊天框的焦点来完成。 - LordRampantHump
你知道StackOverflow在通知方面使用了哪些技术吗? - Geoff
再说一遍...据我所知,这些页面上没有实时更新...只有在页面加载时才会更新。如果这正是你想要的,那就很容易。 - LordRampantHump
@LordRampantHump,你错了,这些页面上有自动更新,而不需要重新加载。我猜测它使用WebSockets将其推送到用户/浏览器,但我还没有深入研究过。 - junkfoodjunkie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接