php最小化資料傳輸:在客戶端儲存數據

WBOY
發布: 2016-08-08 09:34:04
原創
8566 人瀏覽過

將程式輸出為其他的語言是程式設計師喜愛的事情之一,在WEB上我們有
兩個不同程式設計環境:客戶端(瀏覽器)和伺服器端,根據HTTP協定的定義,
我們可以在編寫在客戶端輸出其他語言的服務端程序,我們選擇了作為服
務端語言、javascript作為客戶端輸出。在本問中我們將向您示範這樣用
此方案將資料儲存在客戶端,並且在諸如:聊天室、新聞系統或其他您想
實現的應用程式上達到服務端和客戶端(瀏覽器)的最小的資料傳輸。

要求以下支援:
    php4
    Javascript
    Frames

主要思想:
     
    我們一直試著用PHP發展一個基於HTTP協定的聊天室(HTTP CHAT ROOM),
雖然對聊天來說HTTP協議並不是個好協議,但它可以不受防火牆或代理影響,
PHP完全可以實現此功能而不必使用JAVA APPLETS,而聊天室主要有兩個問題:
第一、由於IE 不支援SERVER PUSH 技術,所以我們只有用CLIENT PULL技術(既
客戶端自動刷新),第二個問題就更深一層了:因為該思想是在客戶端刷新,所以服
務端每次都必須傳送所有的訊息,這意味著大量的資料傳輸,這也正是聊天室延遲的主
要原因,本文試圖解決此問題:
   使用框架技術(frames) 你能夠刷新指定頁面,而不必重新裝載別的頁面,這可
以減少服務/客戶端(C/S)資料傳輸量。我們的模型就是基於該方案。
    "master"文件:定義架構結構
    "loader"頁:匯入資料
    "display"頁:顯示資料
    在該方案,"loder"框每"x"秒自動刷新一次-我們的思想是把資料儲存在"master"
文件內,這樣"loder"頁面只要向服務端請求客戶端所沒有的資料就可以了我們使用時間戳標(timestamp)
記每個訊息來決定那些訊息必須傳給客戶端那些不必傳輸。我們使用PHP4。0的會話管理(session)
儲存客戶端的最後更新的時間戳記(last timestamp)以使時間戳對服務端和用戶端均可見。當"loader"檔
從"master"文件收到資料(注意:"master"文件很大,但是它只傳送一次)時,就刷新顯示頁("diaplay")
而"display"頁只是簡單的呼叫"master"檔案的名為"displaymsgs()"的javascript 函數顯示訊息。此函數動態顯示
儲存在"master"檔案的數據,以下是大體流程圖:
    1。瀏覽器請求"master"頁面(框架),"master"頁面從伺服器端傳送到客戶端(瀏覽器),然後"master"
    檔案產生框架,並將"loader"和"display"頁調到客戶端。
    2。在服務端,"loader" 檔案將分析:如果客戶端沒定義"timestamp" session 變量,"loder"檔案將
    從服務端取得所有數據,並產生javascript程式碼將資料存入"master"文件,然後將"timestamp"變數存為
    session 變數。
    3。 "loder"頁面產生javascript 程式碼刷新 "display"頁面。
    4。刷新請求使得"display"頁面呼叫"diaplaymsgs()"javascript 函數顯示資料
    5。每隔"x" 秒回到步驟2

我們可以該思想如下:
================================================== ======
    "master"檔案:非常大,定義了displaymsgs() 函數和儲存資料和初始值。
    "loader"檔案:小,從服務端取回數據,產生javascript 程式碼
    "display"檔案:非常小,呼叫"master"檔案的"diaplaymsgs()"函數
================================================== =======
    附註:「master"文件只傳送一次
        "loder" 和 "display" 檔案每隔"x"秒刷新一次
        第一次傳送的時候"loder"可能很大,但以後就會很小
        "diaplay"檔案一直不變

如果您對以上的思路還是不太清楚的話,以下我們將建立一個聊天室具體講解該方法,這個聊天室只是為了簡單的演示
所以可能並不是很有用,但是您完全可以使用該思想建立更複雜的聊天室,記住這個思想並不是只用與聊天室 。 :)

    先請您使用MySQL資料庫表單:
        ==============================
        create table testeable (
              timestamp datetime,
              message    text
        );
        ==============================
    "master"文件如下:
        ==================================================
        <script> <br />             lines=new Array(); <br />             function displaymsgs() {     <br />               for(i=0;i<lines.length;i++) { <br />                  display.document.write(lines[i]); <br />                  display.document.write('<BR>'); <br />                   } <br />             } <br />         </script>
        


        
        
        
        
==================================================
        附註:"form"文件是發言框,提供使用者輸入發言框。

        "display"文件內容:
        =====================
        <script> <br />         top.displaymsgs(); <br />         </script>
        ====================
        "display"文件是不是很小? :)
         
        "loader"檔案:
        ====================
        
        session_start(); // 在此使用 Sessions !  

        if(!isset($timestamp)) {  
            //若"timestamp"沒有定義,則定義並設為0  
            $timestamp=0;      
        }  

        $dab=mysql_connect("localhost","user","passWord");  // 開啟資料庫
        mysql_select_db("testbase",$dab);  

        // 找出客戶端所沒有的資訊  
        $query="select * from testeable where timestamp>'$timestamp'";  
        $result=mysql_query($query,$dab);  
        $msgs=array();  

        // 在這個循環,我們儲存最新訊息/數據,並設定"timestamp"為目前最大值
         
        while($res=mysql_fetch_array($result)) {  
            $msgs[]=$res["message"];  
            if($res["timestamp"]>$timestamp) {  
                $timestamp=$res["timestamp"];  
            }  
        }  
        session_register("timestamp"); // 註冊"timestamp"變數

        echo '<script>';  <br /> <br />         // 在這個循環我們產生javascript程式碼 <br />         // 將最新從服務端所得到的資料儲存到"master"頁(注意:使用"top"指向最上方視窗(master) <br />          <br />         for($i=0;$i<$count($msgs);$i++) {  <br />             ?>  <br />             top.lines[top.lines.length]="<?php PRint("$msgs[$i]"); ?>";  <br />             <?php  <br />         }   <br /> <br />         //現在我們將產生"javascript"程式碼 ,讓 "display"頁刷新 <br /> <br />         ?>  <br />         top.display.location.reload();  <br />         </script>  

          
          
          
        =======================================
         
        "form"頁:
        ====================
        
        session_start();  

        if (!isset($timestamp)) {  
              $timestamp=0;  
        }  

        // 顯示表單,產生"timestamp"變數.  
        if (isset($msg)) {  
                $dab=mysql_connect("localhost","root","seldon");  
                mysql_select_db("testbase",$dab);  
               $query="insert into testeable(timestamp,message) values(now(),'$msg')";  
               mysql_query($query,$dab);  
               // 取得timestamp 後的所有訊息
                $query="select * from testeable where timestamp>'$tt'";  
               $result=mysql_query($query,$dab);  
               $msgs=array();$i=0;$timestamp=0;  
                while($res=mysql_fetch_array($result)) {  
                    $msgs[]=$res["訊息"];  
                    if($res["timestamp"]>$timestamp) {  
                            $tt=$res["時間戳"];  
   $tt=$res["時間戳記"];  
                    }  
                }  
                session_register("時間戳");  
                 
            ? >  
                
                                for($i=0;$i             ? >  
                top.lines[top.lines.length]="";  
                          }  
              ? >  
            上方.display.location.reload(); //刷新「顯示」頁
              用者>  
             }  
    ? >  
    
"方法=「貼文」>  
    訊息:  
      
    表格>  
================================================== = ===
    註:我們使得在「表單」頁面提交發言時,立即刷新「顯示」頁面,這樣可以達到對前面發言立即發言
    顯示,更體現即時性。
     
 

以上就介紹了php最小化資料傳輸:在客戶端儲存數據,包括了客戶端儲存資料的內容,希望對PHP教程有興趣的朋友有所幫助。

🎜
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板