在正式環境下試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://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協議,無法自動穿越防火牆。
實例:網絡互動游戲。
- public $filename;
- public function init()
- {
- $this->layout = "main";
- if(isset($_POST["name"])){
- $uname = $_POST["name"];
- $this->filename = date("Ymd",time()).$uname.".txt";
- }
- }
- public function actionIndex()
- {
- $this->render('index');
- }
- //ajax 將數據存進來
- public function actionAjax()
- {
- set_time_limit(0);
- / $file = fopen("20151112aa.txt","a");
- $file = fopen($this->filename,"a");
- $content = '_'.$_POST['content'];
- fwrite($file,$content);
- fclose($file);
- }
- //拿到數據返回
- public function actionGetContent()
- {
- set_time_limit(0);
- /**
- * 判斷是否存在文件,如果不存在,新建一個以當前日期為文件名的txt文件,並將初始消息寫進去
- */
- if(file_exists($this->filename)){
- / echo 1;die;
- if($_POST['num'] == 1){
- exit(json_encode("_welcome you!!!"));
- die;
- }
- $content = file_get_contents($this->filename);
- $content_arr = explode("_",$content);
- $count = count($content_arr);
- /**
- * 做一個while的死循環,每隔300毫秒去比較消息數量,如果大於之前的數量,則以json格式輸出
- * 並跳出此次循環,由客戶端再次發送請求
- */
- while(true){
- $contents = file_get_contents($this->filename);
- $content_arr = explode("_",$contents);
- $counts = count($content_arr);
- if($counts>$count){
- $get_content = array_pop($content_arr);
- echo json_encode($get_content);
- break;
- }
- usleep(3000);
- }
- }else{
- $file = fopen($this->filename,"w");
- $content = "_welcome you!!!";
- fwrite($file,$content);
- fclose($file);
- exit(json_encode($content));
- }
- }
前端html
- <style>
- .color1{color:blue;}
- .color2{color:red;}
- </style>
- <input type="text" id="name"><input type="button" id="btn1" value="sumbit">
- <div id="div_content" style="height:200px;">
- </div>
- <input type="text" id="content">
- <input type="button" id="btn2" value="sumbit">
- <script src="http://icon.xcar.com.cn/2014/muban/js/jquery-1.8.3.min.js"></script>
- <script>
- var name = "";
- $("#btn1").click(function(){
- name = $('#name').val();
- getContent(1);
- })
- var div_obj = $("#div_content");
- var content_obj = $("#content");
- $("#btn2").click(function(){
- var content = content_obj.val();
- if(content){
- $.post("<?= Yii::app()->createUrl("tuan/xu/ajax");?>",{name:name,content:content});
- div_obj.append("<a class='color1'>aa</a>: <em>"+content+"</em><br>");
- }
- })
- function getContent(num){
- $.ajax({
- type:"post",
- data:{name:name,num:num},
- url: "<?= Yii::app()->createUrl("tuan/xu/getContent");?>",
- success: function(data){
- div_obj.append("<a class='color2'>bb</a>: <em>"+data+"</em><br>");
- getContent(2);
- }
- });
- }
- </script>