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資料庫中把發言時間大於使用者進入時間的發言提出顯示出來。而後續顯示新的發言內容的關鍵,在於顯示聊天內容的那段程式是無限循環的。
? #Mysql資料庫連線
mysql_select_db(chat,$db);