PHP聊天室技術

來源:互聯網
上載者:User
關鍵字 PHP聊天室技術

php聊天室技術
黃國輝

1.前言
  上網聊天是時下最流行的交友方式。各大網站推出的聊天室都各具特色。
  聊天室主要分為WebChat、BBSChat兩種。BBSChat是基於Telnet的Tcp協議,是BBS的附設功能,需要用戶端Telnet程式。WebChat則採用瀏覽器方式,實際上是個多人一起使用的CGI程式。其基本原理是把每個使用者的發言通過瀏覽器傳給系統,再由系統收集處理後分發給特定使用者。
  WebChat一般採用Server Push或Client Pull技術。兩種技術的區別在於使用不同的方式將資料分發給使用者,Server Push是由伺服器將資料以多重MIME編碼,推給(push)使用者端,現在較少網站使用這種方式。Client Pull則是使用者從伺服器拉(pull)所要的資料。
  最常用的Client Pull就是利用Html語言的Meta標籤http-equiv="Refresh" 的屬性,每隔一段時間就檢查伺服器上是否有新的資料。例如 ,每隔5秒鐘就會重新整理一次頁面。這種方法簡單有效,缺點是重新整理時會產生閃爍的現象;而且為了保持效率,每次重新整理都會把舊的聊天內容清除,使用者想查看或保留對話內容都很不方便。為此,採用javaApplet作為聊天室的前端,利用重新整理把從伺服器Pull的資料通過JavaApplet來顯示也是一種解決方案。更有就是本文要介紹的使聊天程式保持連線的方案。方法一,把聊天程式配置為無限大,就能使瀏覽器不停地保持下載的連線狀態;方法二,聊天程式中存在著無限迴圈,因為能夠方便地配置更進階的功能,所以在此選擇採用。
  Web伺服器採用FreeBSD+Apache,原因是兩者的組合具備最強的效能,而且花費為零。還需要考慮的是用什麼方式來存放資料呢。用文檔相對而言容易實現,但是多人使用,頻繁地對同一文檔進行IO操作,難免會影響效率,況且FreeBSD的IO效能不佳。能夠考慮使用RamDisk,將文檔整個放進記憶體,以提高速度。或在記憶體中劃分出一塊高速空間用以資料存放。筆者使用的是資料庫方式:MySQL。因為該資料庫就是為大批量使用者同時使用而設計,利用他能夠省去設計高速空間操作的複雜編寫,速度也可得到確保。如將整個資料庫放進記憶體,效果更好。
  程式用PHP+Html+JavaScript編寫。聊天室主要是對Html的Form中的各種元素進行操作。Javascript是基於對象的語言,對Html中的各種元素皆當作對象看待,所以每個元素的方法和屬性都很豐富,操作比較方便。而PHP只有在Form經過Post後,將Form中的元素轉成對應的變數,才能處理使用者輸入的資料。從互動性來說比較差,這也是使用JavaScript的原因。採用PHP的原因是因為比起其他CGI語言,其速度和安全性都較佳,研發也比較容易。

2. 不斷重新整理的聊天室
  一個標準的聊天室頁面由三個Frame組成,分別是顯示線上使用者的Online、使用者發言及功能配置的Say和顯示聊天內容的List。使用者在Say Frame中敲入發言內容後按發送,資料經過處理後儲存在Mysql資料庫,同時被儲存的還包括髮言人、聊天對象及發言的時間。使用者一進入聊天室,List Frame從Mysql資料庫中把發言時間大於使用者進入時間的發言提出顯示出來。而後續顯示新的發言內容的關鍵,在於顯示聊天內容的那段程式是無限迴圈的。
List Frame程式概要:
  $db=mysql_pconnect(localhost,root);  #Mysql資料庫連接
  mysql_select_db(chat,$db);
  顯示歡迎進入聊天室
  配置$init為資料庫中發言時間比
   進入時間大的第一個資料的ID號  #是資料提取的標誌位
  while (1==1) {       #無限迴圈開始
   提取從$init到最後的資料;
   while (每一個資料$text) {
   $emote=strip_tags($text);    #防止使用者直接輸入Html語言
   if (eregi("^/",$emote))     #判斷髮言是否系統命令(以/開頭)
   系統特別處理
   else 顯示發言
   }
   配置$init為最後資料的ID號
   flush();        #清出輸出緩衝,使發言馬上顯示
   sleep(2);        #使程式暫停2秒,節省系統資源
   mysql_free_result($result);    #釋放資料庫結果佔用的記憶體
  }
  因為程式無限迴圈,在每次迴圈中輸出的發言是先置入輸出緩衝區內。通過flush()馬上把緩衝區的內容向使用者的List Frame送出,達到了即時的聊天效果。迴圈最後要釋放Mysql結果集佔用的記憶體,否則因為無限迴圈的緣故,系統資源很快會被耗盡。
  使用者在Login後將建立一個Online的表用於線上使用者的統計,主要是為了防止User表過大,程式中頻繁用到的檢索會拖慢系統的運作。這其中用的最多的是Online Frame,在採用Client Pull的Refresh Meta,每隔一段時間就會查詢Online表,以重新整理線上的使用者。假如使用者不發言超過規定時間,系統會調用自訂函數將使用者設為TimeOut,強制將其退出聊天室。

1 2 下一頁
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.