使用jquery从ajax获取php数据而不使用ajax

时间:2016-10-22 20:02:14

标签: javascript php jquery ajax

我正在开发一个支持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但不是很有用

5 个答案:

答案 0 :(得分:5)

你可以使用socket.io或websockets api这是ajax的替代选项,所以,通过使用socket.io,jquery,php或nodejs,可以在不使用ajax的情况下建立一对一的私人聊天,以下链接将帮助你如何建立私人聊天。

socket.io

WebSockets

Private chat reference 1

Private chat reference 2

答案 1 :(得分:2)

更好的方法是使用nodejs代替php。您可以查看此链接,以获得可以使用的非常好的聊天实现。 虽然php chat有你提到的性能问题,但nodejs并不是因为当有东西需要推送时,它不会轮询消息而是将它们推送到客户端。此外,您还可以立即使用现成的解决方案(当然您必须对其进行修改),这将节省您的开发时间。

但是如果你仍然想要使用php方式,那么你有以下选择:

  • jquery + ajax(就像你现在正在做的那样)
  • php套接字 - 这是使用websockets https://www.sanwebe.com/2013/05/chat-using-websocket-php-socket进行php聊天的示例。这种方法有其优点和缺点。其中一个主要缺点是旧浏览器不支持,可能是设置过程并不那么容易。但我更喜欢它而不是ajax请求。

答案 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