【问题标题】:how to check if database is updated with php and ajax?如何检查数据库是否使用 php 和 ajax 更新?
【发布时间】:2012-08-08 02:13:25
【问题描述】:

我正在制作一个聊天框,一切正常,除了更新。 我目前每 3 秒刷新一次页面以检查是否有新消息,但这肯定会导致服务器负载过大且不优雅。

我想要的是,聊天框只会在数据库更新时检查新消息,而不是每 3 秒检查一次数据库的计时器

【问题讨论】:

  • 你可以使用 websockets 代替 ajax

标签: php ajax chat


【解决方案1】:

您想要 AJAX 推送(服务器仅在有新内容时才向客户端发送更新)。在此处查看示例:http://provatosys.com/bid.html

这样的事情会详细说明来自客户端的请求:

function sendRequest(uid){
    var xmlhttp;
    var myUserId="";
    myUserId=uid;

    if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    } else { // code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange=function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200){
            displayInChat(xmlhttp.responseText)//do stuff (process response, display message)
        }
    }

    xmlhttp.open("GET","process_request.php?userid="+uid,true);
    xmlhttp.send();

    setTimeout("sendRequest("+uid+")",1000); //poll every second
}

现在您想延迟来自服务器 (process_request.php) 的回复,直到有东西要发送(例如使用 while (($msg=new_msgs()) === false) {sleep(timeout);} 之类的东西)或请求超时并从客户端发送新的轮询 (@987654334 @)。这称为长轮询,对于诸如聊天之类的应用程序来说,比回复空响应更有效。

您可以在这里找到更多信息:How do I implement basic "Long Polling"?

这里:Make AJAX call wait for event in php

这里:Comet (programming)

[编辑] 作为一种非常需要且更有效的长轮询替代方案,现在所有主流浏览器都支持websocketsRFC6455 已于 2011 年进入(提议的)标准状态(这意味着它已退出草案状态,此后没有任何变化)。 PHP 中最好的实现可能是Ratchet(据我所知the most up to date 是迄今为止的标准)。这是一个关于如何使用它构建网络聊天的教程:http://socketo.me/docs/hello-world

【讨论】:

  • 我从来不知道这件事(尽管我怀疑它存在)。好答案!您是否有关于其使用/实现的文档/教程的链接?
  • 我也明白了,ajax push是我需要的,但是找不到如何实现它的教程,任何链接或教程?
  • 好吧,您可以使用任何打包的解决方案,例如 APE ape-project.org 或从这里开始:en.wikipedia.org/wiki/Comet_%28programming%29(那里还列出了一些花哨的替代方案,例如 HTML5 websockets),或者只是检查示例中的代码然后自己从那里去(这就是我前一段时间所做的,我记得它很简单:))
猜你喜欢
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2010-10-25
  • 2015-04-06
  • 2020-06-28
  • 2020-09-22
相关资源
最近更新 更多