thinkphp长连接MySQL_ThinkPHP3.2.3---mysql+ajax实现长连接,实时监测数据库数据是否更新...
實現(xiàn)目標
對數(shù)據(jù)庫的數(shù)據(jù)更新進行監(jiān)測,如果更新了數(shù)據(jù)就將數(shù)據(jù)全部顯示出來,沒有更新,則一直監(jiān)測。
比如有一個服務端(瀏覽器),有很多客戶端(瀏覽器),客戶端提交了數(shù)據(jù),服務端想要在不刷新瀏覽器的情況下知道是不是有數(shù)據(jù)提交了,就可以通過長連接實現(xiàn)了,如投票系統(tǒng)等都可以用長連接來實現(xiàn)。在這里就不介紹長連接和短連接以及相關的技術—websocket了。
實現(xiàn)原理
實現(xiàn)原理很簡單,就是通過ajax嵌套,ajax去POST請求,到控制器里面查詢數(shù)據(jù)表的記錄數(shù)是否更改了,如果更改了就將數(shù)據(jù)ajajReturn回來,然后再去ajax Post請求。如此循環(huán)。
測試實現(xiàn)
js
//開始長連接,輪詢查詢數(shù)據(jù)庫
function getData(msg){
if(msg == undefined){
msg = '';
}
$.ajax({
url: localhostPaht +'/Home/Cashier/getAllMsgTradeCode/',
type: 'POST',
dataType: 'json',
data:{
'msg':msg
},
success: function(data){
if(data){
console.log(data);
}
else {
console.log(data.length);
}
getData('');
},
error: function(){
alert("獲取MSG交易編號失敗");
}
});
}
//初始化消息列表數(shù)據(jù)
getData("init");
控制器:
public function getAllMsgCount(){
$sql = "select count(*) as count from t_trade_detail_temp;";
$res = M()->query($sql);
$count = $res[0]['count'];
return $count;
}
public function getAllMsgTradeCode(){
$oldCount = $this->getAllMsgCount();
$sql = "select trade_code from t_trade_detail_temp;";
$data = M()->query($sql);
if($_POST['msg'] == "init"){
$this->ajaxReturn($data);
exit;
}
while(true){
set_time_limit(0);
$newCount = $this->getAllMsgCount();
if($newCount > $oldCount){
$data = M()->query($sql);
$this->ajaxReturn($data);
break;
}
usleep(1000);
}
}
首先第一次調用getData(‘init’);獲取數(shù)據(jù)表初始數(shù)據(jù),然后在ajax嵌套中對數(shù)據(jù)庫進行監(jiān)測,當數(shù)據(jù)庫數(shù)據(jù)更新時,則會在控制器中跳出while循環(huán),返回包括了更新的所有數(shù)據(jù)。然后又重新進入監(jiān)測。
瀏覽器控制臺打印的調試數(shù)據(jù)(客戶端數(shù)據(jù)更新是通過直接在數(shù)據(jù)表中插入數(shù)據(jù)來模擬的):
注意:因為是用ajax POST請求方式,且是嵌套的,所以打開頁面后就不能夠實現(xiàn)刷新了,除非關閉瀏覽器重新打開,這也是不好的一點。不過采用websocket就不會出現(xiàn)這種缺點了。
解決刷新的問題:在控制器的while循環(huán)中,可以設置一個標識,每隔一定的時間就算數(shù)據(jù)表的數(shù)據(jù)沒有更新也返回一個空的數(shù)據(jù)回來,這樣就不是一直在等待,瀏覽器也就可以刷新了。
while(true){
set_time_limit(0);
$time_count++;
$newCount = $this->getAllMsgCount();
if($newCount != $oldCount){
$data = M()->query($sql);
$this->ajaxReturn($data);
break;
}
usleep(1000);
//一定的時間后沒有數(shù)據(jù)變化也跳出
if($time_count >= 800){
$data = "";
$this->ajaxReturn($data);
break;
}
}
當頁面既有同步ajax,又有異步ajax時
這個時候刷新的時間跟time_count有關,time_count越小,刷新時間越短,但是隨之而來的就是服務器的CPU消耗增大。
總結
以上是生活随笔為你收集整理的thinkphp长连接MySQL_ThinkPHP3.2.3---mysql+ajax实现长连接,实时监测数据库数据是否更新...的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: mysql的基准测试_mysql基准测试
- 下一篇: 深度拷贝 java_Java深度拷贝方式
