我正在做一個聊天框,一切工作正常,除了更新的東西。 我目前每3秒刷新頁面以檢查任何新消息,但它肯定會造成服務器上的大量負載,並不優雅。如何檢查數據庫是否更新與PHP和AJAX?
我要的是,聊天框將檢查只有當數據庫被更新的新郵件,而不是每3秒後,檢查數據庫的計時器
我正在做一個聊天框,一切工作正常,除了更新的東西。 我目前每3秒刷新頁面以檢查任何新消息,但它肯定會造成服務器上的大量負載,並不優雅。如何檢查數據庫是否更新與PHP和AJAX?
我要的是,聊天框將檢查只有當數據庫被更新的新郵件,而不是每3秒後,檢查數據庫的計時器
你想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);}
)或請求超時,並從客戶端發送新輪詢(setTimeout("sendRequest("+uid+")",timeoutinmillisecs);
)。這稱爲長輪詢,對於像聊天這樣的應用來說,比用空響應回覆更有效。
您可以在這裏找到更多的信息:How do I implement basic "Long Polling"?
這裏:Make AJAX call wait for event in php
[編輯]作爲一個非常急需的,更有效的替代長輪詢,現在所有主流瀏覽器都支持websockets。 RFC6455已於2011年進入(建議)標準狀態(這意味着它已退出草稿狀態並且自此以後沒有任何變更)。在PHP中最好的實現可能是Ratchet(據我所知目前爲the most up to date)。這裏是如何建立一個網絡聊天使用它的教程:http://socketo.me/docs/hello-world
我從來不知道這個(雖然我懷疑它存在)。好答案!你有鏈接到它的使用/實現的文檔/教程? – Matt 2012-08-10 18:43:46
我也明白了,ajax push是我需要的,但無法找到關於如何實現它的教程,任何鏈接或教程? – 2012-08-10 18:47:20
那麼你可以使用任何打包的解決方案,如APE http://www.ape-project.org/或從這裏開始:http://en.wikipedia.org/wiki/Comet_%28programming%29(也有一些幻想像HTML5 websockets在那裏列出的替代品),或者只是檢查示例中的代碼並從那裏自行前進(這是我前一段時間做的,我記得它非常簡單:)) – NotGaeL 2012-08-10 18:53:47
而不是ajax你可以使用websocket – Gntem 2012-08-10 18:45:38