国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP聊天室技術

2024-05-04 23:00:50
字體:
來源:轉載
供稿:網友
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,強制將其退出聊天室。
3. 用戶功能簡介
  用戶的功能設置在say frame中,可以選擇發言貼圖、說話的語氣等。發言經過特殊的處理后存儲到mysql,例如選擇了一個貼圖后,系統將添加到發言的前面,就可以實現貼圖的效果。
  對于聊天室常用到的emote,例如用戶a輸入“/hello”按發送,list frame中顯示出來的是“用戶a愉快地和大家打招呼”,為了保持效率,用戶輸入的emote會原文直接保存到數據庫,而解析轉換的工作由list frame來完成。
  悄悄話只有自己和聊天對象可以看到,實現上因為發言預先保存有發言人和聊天對象,只要做一個簡單的判斷即可。還有聊天室常有的屏蔽某用戶發言的功能,通過設置一個臨時的陣列來實現,沒必要保存在用戶的數據庫中。
  聊天室人多的時候,大家爭先發言常使人眼花繚亂,這時可以選擇是否屏蔽無關的發言,即意味著只要不是對所有人和自己的發言將不會顯示出來。當然,因為系統會用特殊的顏色來標識和自己有關的發言,就算不選擇該功能,用戶還是能快速地從眾多發言中找到和自己相關的。
  用戶可以在特定時間(系統比較空閑時)將當天和自己有關的發言打包。因為存儲發言的表數據增長速度很快,為保持運行效率,系統隔天就會把它復制后清空。這樣用戶檢索打包發言內容就不會影響聊天系統的運作。
  出于安全的考慮,聊天室的管理功能是獨立的,并沒放在聊天頁面中。主要有用戶資料管理和將搗亂用戶kick out(踢人)兩種功能。將用戶踢出聊天室后將使他在一定的時間內不能再進入聊天室。
  聊天室的安全要求雖然不象電子商務那樣高,但如果用戶被冒名頂替、用戶的發言被竊聽,或者亂踢人,是非常令人不快的。用戶都要在login中填寫名字和密碼才能進入聊天室,但是通過查看login的源代碼,雖然不能看到php的部分,htnl部分的源碼卻顯示login是調用chat.php程序從而進入聊天室的。所以為了防止用戶直接進入聊天室,系統會首先判斷新建立的聊天室是否由login產生的,不是則退出。同理,在聊天室的list frame和post frame也可加上這樣的防護。當然,在list frame和post frame中檢查用戶的身份和密碼,就萬無一失了,只是加重了系統的負擔。
  綜上所述,能看到系統的源代碼無疑是危險的開端,所以系統的編寫盡量用看不到源碼的php;設置由login開啟的聊天室隱藏了瀏覽器的工具條、狀態欄等,并且屏蔽了鼠標的右鍵及快捷鍵。
4. 總結
  用php編寫的聊天室具有高效穩定的特點,是編寫網絡交互程序的最佳選擇。
參考文獻:
[1] rasmus lerdorf著. php manual [m].電子文檔,2000


收集最實用的網頁特效代碼!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 师宗县| 紫金县| 兰考县| 子洲县| 清水县| 博爱县| 游戏| 塔城市| 江口县| 晋宁县| 宁化县| 商城县| 昭觉县| 柳江县| 通榆县| 金川县| 长汀县| 株洲县| 扎囊县| 桂林市| 巴林左旗| 台山市| 中方县| 佳木斯市| 淮北市| 平顶山市| 咸宁市| 武隆县| 西藏| 福清市| 宜章县| 皋兰县| 陵水| 灯塔市| 蓬莱市| 西城区| 南木林县| 石林| 浦北县| 墨玉县| 海安县|