日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

thinkphp长连接MySQL_ThinkPHP3.2.3---mysql+ajax实现长连接,实时监测数据库数据是否更新...

發(fā)布時(shí)間:2025/3/19 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 thinkphp长连接MySQL_ThinkPHP3.2.3---mysql+ajax实现长连接,实时监测数据库数据是否更新... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。