thinkphp长连接MySQL_ThinkPHP3.2.3---mysql+ajax实现长连接,实时监测数据库数据是否更新...
實(shí)現(xiàn)目標(biāo)
對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)更新進(jìn)行監(jiān)測(cè),如果更新了數(shù)據(jù)就將數(shù)據(jù)全部顯示出來,沒有更新,則一直監(jiān)測(cè)。
比如有一個(gè)服務(wù)端(瀏覽器),有很多客戶端(瀏覽器),客戶端提交了數(shù)據(jù),服務(wù)端想要在不刷新瀏覽器的情況下知道是不是有數(shù)據(jù)提交了,就可以通過長(zhǎng)連接實(shí)現(xiàn)了,如投票系統(tǒng)等都可以用長(zhǎng)連接來實(shí)現(xiàn)。在這里就不介紹長(zhǎng)連接和短連接以及相關(guān)的技術(shù)—websocket了。
實(shí)現(xiàn)原理
實(shí)現(xiàn)原理很簡(jiǎn)單,就是通過ajax嵌套,ajax去POST請(qǐng)求,到控制器里面查詢數(shù)據(jù)表的記錄數(shù)是否更改了,如果更改了就將數(shù)據(jù)ajajReturn回來,然后再去ajax Post請(qǐng)求。如此循環(huán)。
測(cè)試實(shí)現(xiàn)
js
//開始長(zhǎng)連接,輪詢查詢數(shù)據(jù)庫(kù)
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交易編號(hào)失敗");
}
});
}
//初始化消息列表數(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);
}
}
首先第一次調(diào)用getData(‘init’);獲取數(shù)據(jù)表初始數(shù)據(jù),然后在ajax嵌套中對(duì)數(shù)據(jù)庫(kù)進(jìn)行監(jiān)測(cè),當(dāng)數(shù)據(jù)庫(kù)數(shù)據(jù)更新時(shí),則會(huì)在控制器中跳出while循環(huán),返回包括了更新的所有數(shù)據(jù)。然后又重新進(jìn)入監(jiān)測(cè)。
瀏覽器控制臺(tái)打印的調(diào)試數(shù)據(jù)(客戶端數(shù)據(jù)更新是通過直接在數(shù)據(jù)表中插入數(shù)據(jù)來模擬的):
注意:因?yàn)槭怯胊jax POST請(qǐng)求方式,且是嵌套的,所以打開頁(yè)面后就不能夠?qū)崿F(xiàn)刷新了,除非關(guān)閉瀏覽器重新打開,這也是不好的一點(diǎn)。不過采用websocket就不會(huì)出現(xiàn)這種缺點(diǎn)了。
解決刷新的問題:在控制器的while循環(huán)中,可以設(shè)置一個(gè)標(biāo)識(shí),每隔一定的時(shí)間就算數(shù)據(jù)表的數(shù)據(jù)沒有更新也返回一個(gè)空的數(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í)間后沒有數(shù)據(jù)變化也跳出
if($time_count >= 800){
$data = "";
$this->ajaxReturn($data);
break;
}
}
當(dāng)頁(yè)面既有同步ajax,又有異步ajax時(shí)
這個(gè)時(shí)候刷新的時(shí)間跟time_count有關(guān),time_count越小,刷新時(shí)間越短,但是隨之而來的就是服務(wù)器的CPU消耗增大。
總結(jié)
以上是生活随笔為你收集整理的thinkphp长连接MySQL_ThinkPHP3.2.3---mysql+ajax实现长连接,实时监测数据库数据是否更新...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql的基准测试_mysql基准测试
- 下一篇: linux cmake编译源码,linu