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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【学无止境】ajax长循环,反向ajax初体会,不用ws实现即时聊天

發布時間:2025/5/22 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学无止境】ajax长循环,反向ajax初体会,不用ws实现即时聊天 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

反向ajax


ajax長循環,又叫comet機制,但是我最喜歡的還是叫他反向ajax

反向ajax,顧名思義,就是不是客戶端來請求服務器端,而是服務器端請求客戶端,這樣做的好處是節省了大量以前輪詢造成的查詢浪費,從而減輕數據庫壓力和服務器壓力

那么如何實現反向ajax呢:

主體

1.在客戶端寫一個ajax,這個ajax里設置一個過期的時間 timeout,這個過期的時間timeout是用來暫時延長ajax的請求時間的,當這個ajax觸發的時候給后臺傳遞一個等于timeout的值。

$.ajax({type: 'POST',dataType: 'json',url: "do.php",timeout: '20000',//請求超時時間data: {'time':'2000000','user':user},// 每次請求等待時間success: function(data){//邏輯代碼 })

2.在后臺的php文件中,我們接受這個timeout,把這個timeout設置為php的擱置時間,這樣就算掛起了php處理的這個進程了,這樣做是為了和前面ajax的過期時間保持一致,從而一致保持ajax請求這個狀態,也就是說在這timeout時間內

ajax的請求和php處理程序進程被掛起了

$time = $_POST['time']; $user = $_POST['user']; if(empty($time)) exit(); set_time_limit(0);// 無限請求超時時間 usleep($time);// 等待時間

重點

3.重點的一步:在一個while循環中處理自己的業務邏輯,然后向前端發送信息,隨后退出當前的線程,這樣做的意義是沾少量的內存和查最少的數據庫

while(true){if(你自己的判斷向客服端發送信息的條件)//send()發送信息后退出線程exit();}else{//無數據發送直接退出線程exit(); }

4.前端重要的一步:當你從后端拿出你要的東西時候,將結束上一個長循環,然后掛起下一個長循環ajax,就算你沒有拿到數據過了超時時間的話也要結束當前ajax,進行下一個ajax。如果沒有數據這個ajax會持續20s,這可比主動每秒訪問服務器好多了,這是服務器主動推的,不是客戶端每秒輪詢的。

success: function(data){//邏輯代碼 } // 未從服務器中獲的數據,繼續擱置 if(data.success == '0'){ajax_for_while() }// ajax超時,進入下一個push擱置機制 error:function(XMLHttpRequest,textStatus,errorThrown){if(textStatus == "timeout"){ajax_for_while()} }

core

客戶端發起一個ajax請求,服務端將請求擱置(pending)或者說掛起,直到到了超時時間(timeout)或需要推送時返回;客戶端則等待ajax返回后處理數據,再發起下一個ajax請求。

這樣的掛起就不是服務器每秒請求ajax的數據庫了,這個timeout時間是可以更改的,多少都行。現在是20s,在20s內ajax不會不斷請求數據庫,或服務器,問他們有沒有信息,而是一旦服務器有信息就會主動推送給客戶端,而不用客戶端每秒都詢問了。

完整的代碼

前端的

function ajax_for_while() {//AJAX長輪詢$.ajax({type: 'POST',dataType: 'json',url: "do.php",timeout: '20000',//請求超時時間data: {'time':'2000000','user':user},// 每次請求等待時間success: function(data){if(data.success == '1')ajax_for_while()}// 未從服務器中獲的數據if(data.success == '0'){ajax_for_while()}},// ajax超時,進入下一個push擱置機制error:function(XMLHttpRequest,textStatus,errorThrown){if(textStatus == "timeout"){ajax_for_while()}}}); }

后臺的

$time = $_POST['time']; $user = $_POST['user']; if(empty($time)) exit(); set_time_limit(0);// 無限請求超時時間 usleep($time);// 等待時間 while(true){//在數據庫中查找相應的最后條未讀數據出來if(empty($user_record_array)){$arr = array('success'=>'0','error'=>'無新數據');echo json_encode($arr);exit();}else{if($user_record_array['state'] == 0){$arr = array('success'=>'0','error'=>'有數據'); echo json_encode($arr); exit();}else{$arr = array('success'=>'0','error'=>'無新數據');echo json_encode($arr);exit();}}}

參考資料

http://www.cnblogs.com/MGer-PHP/p/3701573.html
http://blog.csdn.net/black_ox/article/details/12981195

總結

以上是生活随笔為你收集整理的【学无止境】ajax长循环,反向ajax初体会,不用ws实现即时聊天的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。