php和ajax 服務器端做輪詢推送


在正式環境下試ok,之前一直在本地搭建的集合環境,一跑nigix就掛。

php端,就是ajax請求服務器,服務器一直輪詢請求,有相應返回。

網上有相關文章:http://www.cnblogs.com/hoojo/p/longPolling_comet_jquery_iframe_ajax.html

 

Web 通信 之 長連接、長輪詢(long polling)

基於HTTP的長連接,是一種通過長輪詢方式實現"服務器推"的技術,它彌補了HTTP簡單的請求應答模式的不足,極大地增強了程序的實時性和交互性。

一、什么是長連接、長輪詢?

用通俗易懂的話來說,就是客戶端不停的向服務器發送請求以獲取最新的數據信息。這里的“不停”其實是有停止的,只是我們人眼無法分辨是否停止,它只是一種快速的停下然后又立即開始連接而已。 

二、長連接、長輪詢的應用場景

長連接、長輪詢一般應用與WebIM、ChatRoom和一些需要及時交互的網站應用中。其真實案例有:WebQQ、Hi網頁版、Facebook IM等。

如果你對服務器端的反向Ajax感興趣,可以參考這篇文章 DWR 反向Ajax 服務器端推的方式:http://www.cnblogs.com/hoojo/category/276235.html

歡迎大家繼續支持和關注我的博客:

http://hoojo.cnblogs.com

http://blog.csdn.net/IBM_hoojo

也歡迎大家和我交流、探討IT方面的知識。

email:hoojo_@126.com 

三、優缺點

輪詢:客戶端定時向服務器發送Ajax請求,服務器接到請求后馬上返回響應信息並關閉連接。 
優點:后端程序編寫比較容易。 
缺點:請求中有大半是無用,浪費帶寬和服務器資源。 
實例:適於小型應用。


長輪詢:客戶端向服務器發送Ajax請求,服務器接到請求后hold住連接,直到有新消息才返回響應信息並關閉連接,客戶端處理完響應信息后再向服務器發送新的請求。 
優點:在無消息的情況下不會頻繁的請求,耗費資源小。 
缺點:服務器hold連接會消耗資源,返回數據順序無保證,難於管理維護。 
實例:WebQQ、Hi網頁版、Facebook IM。

 

長連接:在頁面里嵌入一個隱蔵iframe,將這個隱蔵iframe的src屬性設為對一個長連接的請求或是采用xhr請求,服務器端就能源源不斷地往客戶端輸入數據。 
優點:消息即時到達,不發無用請求;管理起來也相對方便。 
缺點:服務器維護一個長連接會增加開銷。 
實例:Gmail聊天


Flash Socket:在頁面中內嵌入一個使用了Socket類的 Flash 程序JavaScript通過調用此Flash程序提供的Socket接口與服務器端的Socket接口進行通信,JavaScript在收到服務器端傳送的信息后控制頁面的顯示。 
優點:實現真正的即時通信,而不是偽即時。 
缺點:客戶端必須安裝Flash插件;非HTTP協議,無法自動穿越防火牆。 
實例:網絡互動游戲。

[php]  view plain copy
 
  1. public $filename;  
  2.    public function init()  
  3.    {  
  4.        $this->layout  = "main";  
  5.        if(isset($_POST["name"])){  
  6.            $uname = $_POST["name"];  
  7.            $this->filename = date("Ymd",time()).$uname.".txt";  
  8.        }  
  9.    }  
  10.   
  11.    public function actionIndex()  
  12.    {  
  13.        $this->render('index');  
  14.    }  
  15.   
  16.    //ajax 將數據存進來  
  17.    public function actionAjax()  
  18.    {  
  19.        set_time_limit(0);  
  20. /        $file = fopen("20151112aa.txt","a");  
  21.        $file = fopen($this->filename,"a");  
  22.        $content = '_'.$_POST['content'];  
  23.        fwrite($file,$content);  
  24.        fclose($file);  
  25.    }  
  26.   
  27.    //拿到數據返回  
  28.    public function actionGetContent()  
  29.    {  
  30.        set_time_limit(0);  
  31.        /** 
  32.         * 判斷是否存在文件,如果不存在,新建一個以當前日期為文件名的txt文件,並將初始消息寫進去 
  33.         */  
  34.        if(file_exists($this->filename)){  
  35. /            echo 1;die;  
  36.            if($_POST['num'] == 1){  
  37.                exit(json_encode("_welcome you!!!"));  
  38.                die;  
  39.            }  
  40.            $content = file_get_contents($this->filename);  
  41.            $content_arr = explode("_",$content);  
  42.            $count = count($content_arr);  
  43.            /** 
  44.             * 做一個while的死循環,每隔300毫秒去比較消息數量,如果大於之前的數量,則以json格式輸出 
  45.             * 並跳出此次循環,由客戶端再次發送請求 
  46.             */  
  47.            while(true){  
  48.   
  49.                $contents = file_get_contents($this->filename);  
  50.                $content_arr = explode("_",$contents);  
  51.                $counts = count($content_arr);  
  52.                if($counts>$count){  
  53.                    $get_content = array_pop($content_arr);  
  54.                    echo json_encode($get_content);  
  55.                    break;  
  56.                }  
  57.                usleep(3000);  
  58.            }  
  59.   
  60.        }else{  
  61.            $file = fopen($this->filename,"w");  
  62.            $content = "_welcome you!!!";  
  63.            fwrite($file,$content);  
  64.            fclose($file);  
  65.   
  66.            exit(json_encode($content));  
  67.        }  
  68.    }  


前端html

[html]  view plain copy
 
  1. <style>  
  2.     .color1{color:blue;}  
  3.     .color2{color:red;}  
  4. </style>  
  5. <input type="text" id="name"><input type="button" id="btn1" value="sumbit">  
  6. <div id="div_content" style="height:200px;">  
  7.   
  8. </div>  
  9. <input type="text" id="content">  
  10. <input type="button" id="btn2" value="sumbit">  
  11.   
  12. <script src="http://icon.xcar.com.cn/2014/muban/js/jquery-1.8.3.min.js"></script>  
  13. <script>  
  14.     var name = "";  
  15.     $("#btn1").click(function(){  
  16.         name = $('#name').val();  
  17.         getContent(1);  
  18.     })  
  19.   
  20.     var div_obj     = $("#div_content");  
  21.     var content_obj = $("#content");  
  22.     $("#btn2").click(function(){  
  23.         var content = content_obj.val();  
  24.         if(content){  
  25.             $.post("<?= Yii::app()->createUrl("tuan/xu/ajax");?>",{name:name,content:content});  
  26.             div_obj.append("<class='color1'>aa</a>: <em>"+content+"</em><br>");  
  27.         }  
  28.     })  
  29.   
  30.     function getContent(num){  
  31.         $.ajax({  
  32.             type:"post",  
  33.             data:{name:name,num:num},  
  34.             url: "<?= Yii::app()->createUrl("tuan/xu/getContent");?>",  
  35.             success: function(data){  
  36.                 div_obj.append("<class='color2'>bb</a>: <em>"+data+"</em><br>");  
  37.                 getContent(2);  
  38.             }  
  39.         });  
  40.     }  
  41. </script>  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM