繁体   English   中英

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

[英]Getting php data from database using jquery without ajax

我正在开发一个支持PHP的查询聊天,目前我正在使用ajax从服务器中提取数据并将其显示在聊天室中,但这会使用多个ajax请求到客户端计算机,这会导致它减慢速度....

这就是我使用ajax和yii2做的事情

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

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

然后我正在使用

windows.setInterval(getdata(),1000);

有没有更好的方法来获取这个子数据而不使用ajax和jquery

我已经检查了这个链接,但它不是很有帮助

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

socket.io

的WebSockets

私人聊天参考1

私人聊天参考2

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

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

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

你提到从数据库中获取数据,但有人可能会说,为了聊天应用程序的目的,数据库是偶然的。 也许你想存储聊天记录,数据库是一个自然的地方,但主要功能是传输消息。 所以你使用数据库作为某种消息缓冲区。

正如其他人所提到的,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) {
    //
}

你可以做一个技巧,假设数据不是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);
}

没有任何合理的方法。 你必须以某种方式带来新数据吗? 要做到这一点的方法是重新加载页面或通过Javascript / Ajax来避免重新加载。

您可以将更新设置为单面,以便当人员A写入人员B时,将对新消息的提交执行请求。 这意味着除非发送一条消息,否则不会检索新消息。 (不实用)

另一种方法是在某个地方注明最后一个消息时间,你可以反复检查。 如果时间发生变化,您可以获取新数据,但这不会确定请求数量......只会传输数据量。

我建议你看一下json / php中数据的大小。 您是否进行过测试以了解测试时间或性能如何?

我可以向您推荐这篇文章 ,如果你喜欢它是使用非jQuery的请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM